asp.net-core - ClaimType.GivenName 不返回我的名字
问题描述
我正在开发从 Azure AD 进行身份验证的 .net core 2.2 应用程序。我想在 RAZOR Web 应用程序的 _LoginPartial.cshtml 中获取用户的名字。我能够获得用户的姓氏和电子邮件,但不能获得名字。有办法得到这个吗?
这是我在登录部分视图中的内容:
Claim nameClaim = User.Claims.FirstOrDefault<Claim>(claim => string.Compare(claim.Type, "name", StringComparison.Ordinal) == 0);
string userName = (nameClaim != null) && !string.IsNullOrEmpty(nameClaim.Value) ? nameClaim.Value : ((User != null) && (User.Identity != null) ? User.Identity.Name : string.Empty);
我也试过这个:
@User.FindFirst(System.Security.Claims.ClaimTypes.GivenName).Value
给定的名称返回与名称和电子邮件属性相同的电子邮件!
通过在 asp.net 中扩展身份模型来获得名字的理想方法是什么?
解决方案
FirstName
对于 Identity,内置没有IdentityUser
,您需要实现自己的用户,例如:
public class ApplicationUser:IdentityUser
{
public string FirstName { get; set; }
}
然后,实施UserClaimsPrincipalFactory<ApplicationUser>
public class CustomClaimsIdentityFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public CustomClaimsIdentityFactory(UserManager<ApplicationUser> userManager
, IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor)
{
}
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
//custom claims
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim("FirstName", user.FirstName)
});
return principal;
}
}
然后,您可以FirstName
通过@User.Claims.FirstOrDefault(c => c.Type == "FirstName")?.Value
喜欢 检查
@using Microsoft.AspNetCore.Identity
@using TestIdentity.Data
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Claims.FirstOrDefault(c => c.Type == "FirstName")?.Value!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
推荐阅读
- excel - VBA Excel,更快的复制粘贴公式代码
- tensorflow - 不仅在跟踪时如何在 TensorFlow 中读取文件?
- twitter - 用于查找 Twitter 数据的软件包
- .net - 如何从命令行界面使用 Microsoft.CodeAnalysis.NetAnalyzers 为 .NET 应用程序运行代码分析
- postgresql - 如何遍历表动态生成case语句
- javascript - 为什么 forEach 不会遍历整个数组?
- ruby-on-rails - 如何将记录关系与同一模型的另一个模型关系结合起来?
- broadcast - 我正在尝试通过 OBS 在 YouTube 上开始直播,但我无法创建直播并开始直播
- sql - SSIS 使用派生列动态添加源中不存在的列
- android - 使用 React Native Animated 在 Android 上消失的 React Native 动画图像