如何在 Asp.Net Core Razor View 内获得领地

How to get claim inside Asp.Net Core Razor View

我在我的 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 视图中快速搜索 claims identity 得到了类似的问答: MVC 5 Access Claims Identity User Data

在 Core 3.0 中,使用视图授权

Startup.cs

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Claim_Name", x => x.RequireClaim("Claim_Name"));
    });

然后里面UI

    if ((AuthorizationService.AuthorizeAsync(User, "Claim_Name")).Result.Succeeded){
        //show ui element
    }

View-based authorization in ASP.NET Core MVC

在 .net 核心 2.2 中测试 在剃须刀页面中:

@User.FindFirst("nameOfClaim").值

您可以在您的视图中使用以下代码实现此目的:

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
}

这种方式更好,因为它使用定义的策略,可以验证许多不同的值。