Security.Principal.Identity用于获取用户电子邮件的扩展方法

本文关键字:电子邮件 扩展 方法 用户 获取 Principal Identity 用于 Security | 更新日期: 2023-09-27 17:58:36

在我的项目ASP中,我使用的是ASP.NET Identity 2.2.1。在许多地方,我必须获得当前(已登录)用户的电子邮件。现在我发现用户正在使用这个:

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>());
var email = user.Email;

我注意到GetUserId<T>是一个扩展方法,可以在Microsoft.AspNet.Identity 中的IdentityExtensions类中找到

我创建了自己的扩展方法,通过允许以的形式获取电子邮件,简化了获取电子邮件的过程

var email = User.Identity.GetUserEmail()

下面是我的分机号:

public static class MyIIdentityExtensions
{
    public static string GetUserEmail(this IIdentity identity)
    {
        if (identity == null)
        {
            throw new ArgumentNullException("identity");
        }
        var ci = identity as ClaimsIdentity;
        if (ci == null) return null;
        var um = HttpContext.Current.GetOwinContext().GetUserManager<UserManager>();
        if (um == null) return null;
        var user = um.FindById(ci.GetUserId<int>());
        if (user == null) return null;
        return user.Email;
    }
}

但它比内置扩展方法复杂得多

我能简化一下吗?也许有内置的方法可以做到这一点?我想要的是从user.Identity.

Security.Principal.Identity用于获取用户电子邮件的扩展方法

获取当前登录用户的Email的简单方法

如果使用UserManager,则每次调用GetUserEmail方法时都会命中数据库。

相反,您可以将电子邮件添加为索赔。在ApplicationUser类中有GenerateUserIdentityAsync方法

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
     // Add custom user claims here
     userIdentity.AddClaim(new Claim(ClaimTypes.Email, this.Email));
     return userIdentity;
}

然后你的扩展方法得到它

public static class IdentityExtensions
{
    public static string GetUserEmail(this IIdentity identity)
    {
        if (identity == null)
        {
            throw new ArgumentNullException("identity");
        }
        var ci = identity as ClaimsIdentity;
        if (ci != null)
        {
            return ci.FindFirstValue(ClaimTypes.Email);
        }
        return null;
    }
}