public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } // Sign in the user with this external login provider if the user already has a login var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.Failure: default: // If the user does not have an account, then prompt the user to create an account ViewBag.LoginProvider = loginInfo.Login.LoginProvider; // Get the information about the user from the external login provider var identity = loginInfo.ExternalIdentity; string email = loginInfo.Email; string name = identity.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:name").Value; string accessToken = identity.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:accesstoken").Value; string url = identity.Claims.FirstOrDefault(c => c.Type == "urn:linkedin:url").Value; // check they are authorised RAGContext rag = new RAGContext(); var permittedUsers = rag.PermittedUsers.Where(p => p.Email == email); if (permittedUsers != null && permittedUsers.Count() == 1) { var permitted = permittedUsers.First(); var user = new ApplicationUser { UserName = email, Email = email, FullName = name, LinkedInProfile = url, LinkedInToken = accessToken, PermittedUser=permitted }; var createResult = await UserManager.CreateAsync(user); if (createResult.Succeeded) { // set roles if(!string.IsNullOrEmpty(permitted.Roles)) { string[] roles = permitted.Roles.Split(new char[] { ',' }); foreach (string role in roles) { await this.UserManager.AddToRoleAsync(user.Id, role); } } createResult = await UserManager.AddLoginAsync(user.Id, loginInfo.Login); if (createResult.Succeeded) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); return RedirectToLocal(returnUrl); } } } ExternalLoginFailureViewModel model = new ExternalLoginFailureViewModel(email); return View("ExternalLoginFailure", model); } }
public ActionResult Apply(ExternalLoginFailureViewModel model) { MessageHandler.SendEmailAsync("*****@*****.**", "Application for access to innovation.org.je", string.Format("{0} has requested access.", model.EmailAddress)); return View("ApplicationSent"); }