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.
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;
}
}