Example #1
0
        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());
        }