gpt4 book ai didi

c# - Security.Principal.IIdentity 获取用户邮箱的扩展方法

转载 作者:行者123 更新时间:2023-11-30 20:34:57 27 4
gpt4 key购买 nike

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

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

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

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

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

但它比build-in extension methods复杂得多

我可以简化这个吗?也许有这样做的内置方法?我想要的是获得 Email 的简单方法来自 User.Identity 的当前登录用户。

最佳答案

如果您使用 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;
}
}

关于c# - Security.Principal.IIdentity 获取用户邮箱的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38591607/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com