ASP.NET Web窗体获取当前用户电子邮件并分配有关用户身份的数据

时间:2016-08-08 22:17:39

标签: c# asp.net asp.net-identity

我正在构建一个使用ASP身份验证的Web窗体网站和两个用于存储数据的数据库。当用户注册它在这两个表上创建记录时,这是我的register.aspx C#代码:

if (result.Succeeded)
                    {
                        infoLicencia.license_activations++;
                        res_users regUser = new res_users
                        {
                            branch_gkey = infoLicencia.branch_gkey,
                            licence_gkey = infoLicencia.license_gkey,
                            activo = true,
                            fecha_registro = DateTime.Now,
                            email = user.Email
                        };
                        db.res_users.Add(regUser);
                        db.SaveChanges();
                        // Para obtener más información sobre cómo habilitar la confirmación de cuentas y el restablecimiento de contraseña, visite http://go.microsoft.com/fwlink/?LinkID=320771
                        //string code = manager.GenerateEmailConfirmationToken(user.Id);
                        //string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
                        //manager.SendEmail(user.Id, "Confirmar cuenta", "Para confirmar la cuenta, haga clic <a href=\"" + callbackUrl + "\">aquí</a>.");
                        signInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
                        IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                    }

这很好用,但现在我需要检索存储在其他数据库中的数据并使其可用于用户会话。

我在IdentityModels.cs上试过这个:

 public class ApplicationUser : IdentityUser
    {
        public ClaimsIdentity GenerateUserIdentity(ApplicationUserManager manager)
        {
            // Tenga en cuenta que authenticationType debe coincidir con el valor definido en CookieAuthenticationOptions.AuthenticationType
            var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Agregar reclamaciones de usuario personalizadas aquí
            var Database2 = new PPublicEntities();
            var UserData = Database2.res_users.Single(i => i.email == Email);
            userIdentity.AddClaim(new Claim("BranchId", UserData.branch_gkey.ToString()));

            return userIdentity;
        }

        public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
        {
            return Task.FromResult(GenerateUserIdentity(manager));
        }

    }

但是这个Email属性为null,我需要当前用户的电子邮件来搜索其他数据库中的数据。我以为这个Email属性在登录时填充,我真的不知道该怎么做,为什么所有索赔值必须是String?我真的希望它可以是一个很长的类型。

1 个答案:

答案 0 :(得分:0)

默认情况下,用户电子邮件未在身份验证期间添加到用户声明我们必须明确地将其添加为以下代码段。

userIdentity.AddClaim(new Claim(Constants.EmailClaimType, "User Email", ClaimValueTypes.String));

您还可以编写一个小方法来检索当前的用户声明信息。对于电子邮件:

public static string GetCurrentUserEmail()
        {
            var userEmail = string.Empty;
            var claimIdentity = new ClaimsIdentity(Thread.CurrentPrincipal.Identity);
            var userEmailClaim = claimIdentity.Claims.FirstOrDefault(x => x.Type == IdentityConstants.EmailClaimType);

            if (userEmailClaim != null)
            {
                userEmail = userEmailClaim.Value;
            }
            return userEmail;
        }

您可能需要查看我在GitHub

创建的库