我在我的rc1项目中这样做:
User.Claims.ElementAt(#).Value
但是当我切换到rtm之后,它就不能用了。当我调试Razor视图时,对象看起来一样,但是User.Claims为空。你有什么想法,原因可能是什么。
我在我的rc1项目中这样做:
User.Claims.ElementAt(#).Value
但是当我切换到rtm之后,它就不能用了。当我调试Razor视图时,对象看起来一样,但是User.Claims为空。你有什么想法,原因可能是什么。
假设您已经将声明附加到当前主体。在您的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")
希望这可以帮到你。
在razor视图中搜索声明标识的快速方法,在MVC 5 Access Claims Identity User Data中有一个类似的问题和答案。
在 Razor 页面中测试 .NET Core 2.2:
@User.FindFirst("nameOfClaim").Value
(说明:该段文字已经是中文,无需翻译) services.AddAuthorization(options =>
{
options.AddPolicy("Policy_Name", x => x.RequireClaim("Policy_Name"));
});
@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService
然后在代码主体内使用:
@if ((await AuthorizationService.AuthorizeAsync(User, "Policy_Name")).Succeeded){
//show ui element
}
if(User.FindFirst("MyClaim")?.Value == "some_value")
{
... Show concerned UI block
}
尽管如此,如果您使用策略(作为推荐的方式),我建议在您的Startup.cs / Program.cs中定义策略,并使用注入的IAuthorizationService
调用AuthorizeAsync
:
if((await AuthorizationService.AuthorizeAsync(User, "MyClaim")).Succeeded)
{
... Show concerned UI block
}
这种方式更好,因为它使用了定义的策略,可以验证许多不同的值。