private static IDictionary <string, TimetableUserEntry> GetTimetableUsers(IEnumerable <string> userIds) { TimetableUserRepository userRepository = new TimetableUserRepository(); Dictionary <string, TimetableUserEntry> users = userIds .Distinct() .Select(userRepository.GetByUsername) .Where(entry => entry != null) .ToDictionary(entry => entry.UserId); return(users); }
public ActionResult Login(LoginForm form) { if (AuthHelpers.IsAuthenticated(User)) { return(RedirectAfterLogin(true)); } if (!ModelState.IsValid) { // Something went wrong during binding probably return(View()); } string username = TimetableUserEntry.NormalizeUsernameToId(form.Username); TimetableUserEntry user = new TimetableUserRepository().GetByUsername(username); if (user == null) { ModelState.AddModelError("Username", "This username doesn't exist"); return(View()); } // https://stackoverflow.com/a/31585768/2588539 ClaimsIdentity identity = new ClaimsIdentity( new[] { // These 2 are required for default antiforgery provider new Claim(ClaimTypes.NameIdentifier, username), new Claim( "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string" ), // Additional stuff new Claim(ClaimTypes.Role, user.IsStudentSupport ? Roles.StudentSupport : Roles.Student), new Claim(ClaimTypes.Name, user.Fullname), new Claim(AuthHelpers.DebugModeClaim, "1") }, DefaultAuthenticationTypes.ApplicationCookie ); HttpContext.GetOwinContext().Authentication.SignIn( new AuthenticationProperties { IsPersistent = false }, identity ); return(RedirectAfterLogin()); }
public StudentMailerJob(SmtpClient smtpClient, VotingDbContext db, TimetableUserRepository timetableUserRepository) { _smtpClient = smtpClient; _db = db; _timetableUserRepository = timetableUserRepository; }
public ActionResult LoginSso(string timetableToken, string returnUrl) { if (AuthHelpers.IsAuthenticated(User)) { return(RedirectAfterLogin(true)); } if (timetableToken == null) { // Store the return URL in session to use it when the user comes back if (!string.IsNullOrWhiteSpace(returnUrl)) { Session[ReturnUrlKey] = returnUrl; } return(RedirectToSso()); } if (!Guid.TryParse(timetableToken, out Guid tokenGuid)) { AuthHelpers.Logger.Information( "SSO Fail: failed to parse token GUID '{token}' from {UserHostAddress} ", timetableToken, Request.UserHostAddress ); return(FailCallback()); } TimetableDbContext timetableDb = new TimetableDbContext(); AuthToken token = timetableDb.AuthTokens.Find(tokenGuid); if (token == null || token.UserHostAddress != Request.UserHostAddress) { AuthHelpers.Logger.Information( "SSO Fail: Token {Guid} not found or UserHostAddress ({UserHostAddress}) doesn't match", tokenGuid, Request.UserHostAddress ); return(FailCallback()); } AuthSession session = timetableDb.AuthSessions.Find(token.SessionGuid); if (session == null || session.ExpiresAt < DateTime.Now) { AuthHelpers.Logger.Information( "SSO Fail: Session for token {Guid} not found or it has expired. UserHostAddress: {UserHostAddress}", tokenGuid, Request.UserHostAddress ); return(FailCallback()); } TimetableUserEntry user = new TimetableUserRepository(timetableDb) .GetByUsername(session.UserEmail); if (user == null || user.UserId != TimetableUserEntry.NormalizeUsernameToId(session.UserEmail)) { AuthHelpers.Logger.Information( "SSO Fail: Session for token {Guid} failed to match a timetable user. UserHostAddress: {UserHostAddress}", tokenGuid, Request.UserHostAddress ); return(FailCallback()); } // All good, sign in timetableDb.AuthTokens.Remove(token); timetableDb.SaveChanges(); ClaimsIdentity identity = new ClaimsIdentity( new[] { // These 2 are required for default antiforgery provider new Claim(ClaimTypes.NameIdentifier, user.UserId), new Claim( "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string" ), // Additional stuff new Claim(ClaimTypes.Role, user.IsStudentSupport ? Roles.StudentSupport : Roles.Student), new Claim(ClaimTypes.Name, user.Fullname), new Claim(AuthHelpers.TimetableSessionClaim, session.Guid.ToString()) }, DefaultAuthenticationTypes.ApplicationCookie ); Session[FailedSsoAttemptsKey] = 0; HttpContext.GetOwinContext().Authentication.SignIn( new AuthenticationProperties { IsPersistent = true // We validate on every request anyway, so prevent needless redirects }, identity ); AuthHelpers.Logger.Information( "SSO Success: token {Guid} was used for successful sign in by {UserId}. UserHostAddress: {UserHostAddress}", tokenGuid, user.UserId, Request.UserHostAddress ); return(RedirectAfterLogin()); }
public StudentSupportEmailJobs(VotingDbContext db, TimetableUserRepository userRepository) : base(db) { _userRepository = userRepository; }