public async Task<ActionResult> Index(ExternalRegistrationModel model) { var ctx = Request.GetOwinContext(); var partial_user = await ctx.Environment.GetIdentityServerPartialLoginAsync(); if (partial_user == null) { return View("Error"); } if (ModelState.IsValid) { // update the "database" for our users with the registration data var subject = partial_user.GetSubjectId(); var db_user = ExternalRegistrationUserService.Users.Single(x => x.Subject == subject); db_user.Claims.Add(new Claim(Constants.ClaimTypes.GivenName, model.First)); db_user.Claims.Add(new Claim(Constants.ClaimTypes.FamilyName, model.Last)); // replace the name captured from the external identity provider var nameClaim = db_user.Claims.Single(x => x.Type == Constants.ClaimTypes.Name); db_user.Claims.Remove(nameClaim); nameClaim = new Claim(Constants.ClaimTypes.Name, model.First + " " + model.Last); db_user.Claims.Add(nameClaim); // mark user as registered db_user.IsRegistered = true; // this replaces the name issued in the partial signin cookie // the reason for doing is so when we redriect back to IdSvr it will // use the updated name for display purposes. this is only needed if // the registration process needs to use a different name than the one // we captured from the external provider var partialClaims = partial_user.Claims.Where(x => x.Type != Constants.ClaimTypes.Name).ToList(); partialClaims.Add(nameClaim); await ctx.Environment.UpdatePartialLoginClaimsAsync(partialClaims); // find the URL to continue with the process to the issue the token to the RP var resumeUrl = await ctx.Environment.GetPartialLoginResumeUrlAsync(); return Redirect(resumeUrl); } return View(); }
public async Task<ActionResult> Index(ExternalRegistrationModel model) { var ctx = Request.GetOwinContext(); var partial_login = await ctx.Environment.GetIdentityServerPartialLoginAsync(); if (partial_login == null) { return View("Error"); } if (ModelState.IsValid) { // update the "database" for our users with the registration data var nameIdClaim = partial_login.Claims.First(x => x.Type == Constants.ClaimTypes.ExternalProviderUserId); var provider = nameIdClaim.Issuer; var providerUserId = nameIdClaim.Value; var user = new SampleApp.RegisterFirstExternalRegistrationUserService.CustomUser { Subject = Guid.NewGuid().ToString(), Provider = provider, ProviderID = providerUserId, Claims = new List<Claim> { new Claim(Constants.ClaimTypes.Name, model.First + " " + model.Last), new Claim(Constants.ClaimTypes.GivenName, model.First), new Claim(Constants.ClaimTypes.FamilyName, model.Last), } }; SampleApp.RegisterFirstExternalRegistrationUserService.Users.Add(user); // find the URL to continue with the process to the issue the token to the RP var resumeUrl = await ctx.Environment.GetPartialLoginResumeUrlAsync(); return Redirect(resumeUrl); } return View(); }