我在我的rc1项目中做过:
User.Claims.ElementAt(#).Value
但是在我改用rtm之后它就再也行不通了。当我调试Razor视图时,对象看起来相同,但User.Claims只是空的。不知道原因是什么。
答案 0 :(得分:21)
假设您已向当前委托人提出索赔。在你的Razor视图中:
@((ClaimsIdentity) User.Identity)
这将使您可以访问当前用户的ClaimsIdentity。为了使您的声明保持清洁,您可能需要创建一种搜索声明的扩展方法。
public static string GetSpecificClaim(this ClaimsIdentity claimsIdentity, string claimType)
{
var claim = claimsIdentity.Claims.FirstOrDefault(x => x.Type == claimType);
return (claim != null) ? claim.Value : string.Empty;
}
然后,您只需访问所需的任何声明:
@((ClaimsIdentity) User.Identity).GetSpecificClaim("someclaimtype")
希望这有帮助。
在剃须刀视图中快速搜索声明标识提出了类似的问题和答案: MVC 5 Access Claims Identity User Data
答案 1 :(得分:3)
在.net core 2.2中测试 在剃须刀页面中:
@ User.FindFirst(“ nameOfClaim”)。Value
答案 2 :(得分:0)
在Core 3.0中,使用视图授权
Startup.cs
services.AddAuthorization(options =>
{
options.AddPolicy("Claim_Name", x => x.RequireClaim("Claim_Name"));
});
然后在用户界面内
if ((AuthorizationService.AuthorizeAsync(User, "Claim_Name")).Result.Succeeded){
//show ui element
}