ASP.NET 索赔政策未授权

ASP.NET claim policy not authorizing

我已经设置了一个基本的 TestAdmin 帐户以在微服务应用程序中使用基于声明的身份验证。我把相关代码设置如下:

await userManager.AddClaimAsync(testAdmin, new Claim(ClaimTypes.Role, "NavInvoices"));

这显示在 AspNetUserClaims 数据库中,因此正在创建和保存。 我尝试了这两种方法来设置策略(我只检查现在是否存在 ClaimTypes.Role):

services.AddAuthorization(options =>
        {
            options.AddPolicy("NavInvoices2", policy => policy.RequireClaim(ClaimTypes.Role));
        });

services.AddAuthorization(options =>
        {
            options.AddPolicy("NavInvoices", policy =>
                policy.RequireAssertion(context =>
                    context.User.HasClaim(c =>
                        (c.Type == ClaimTypes.Role))));
        });

这是控制器:

[Authorize(Policy = "NavInvoices")]
    public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";


        return View();
    }

问题是当我遍历 user.claims 时没有任何作用。只有电子邮件、姓名等。在 SqlDB 中,只有我创建的角色存在。 None 这些其他存在的东西,如姓名和电子邮件,都在数据库中。所以某处存在断开连接。我正在使用 IdentityServer4 的 Quickstart EFandAspNetIdentity 模板作为我的基础(如果有人熟悉的话)。

我已经用谷歌搜索了一切,但到目前为止我找不到任何东西。我认为有两个独立的存储正在进行,cookie 只将其中一个传递给 webmvc 项目。有什么建议吗?

确保在将身份令牌传递给客户时将声明包含在身份令牌中。

客户端配置应包含以下几行:-

  new Client
   {
     ClientId = "yourclient",
     ClientName = "Your Client",
     // left out for brevity
     AlwaysSendClientClaims = true, 
     AlwaysIncludeUserClaimsInIdToken = true
   }

这应该允许所有用户声明通过。

您可以查看我之前回答的这个问题以获取更多信息,并查看我的存储库中的示例:-