gpt4 book ai didi

c# - 如何在IdentityServer4/Identity中配置角色声明名称

转载 作者:行者123 更新时间:2023-11-30 23:08:21 26 4
gpt4 key购买 nike

我的问题:[Authorize(Roles = "L1")] 和 User.IsInRole("L1") 正在寻找声明名称“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”而不是“role”

具体来说:我通过以下步骤 ( http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html ) 使用标准身份数据库创建了一个 IdentityServer4:

  • 创建新项目
    • ASP.NET Core Web 应用程序(.NET Core)
    • ASP.NET 核心 1.1
    • 网络应用
    • 更改身份验证
      • 个人用户帐户
  • 添加 IdentityServer4.AspNetIdentity + Config.cs + ...

然后我创建了一个 MVC 客户端。身份验证工作正常。我还得到一份 claim list 。

我在 IdentityServer4 中使用表 AspNetUsers、AspNetUserRoles 和 AspNetRoles 来配置角色。角色被添加到声明名称为“role”的声明中。

如果我尝试在 MVC 客户端中授权我的 Controller 操作,我的角色声明名称似乎是错误的。

如何解决冲突?我是否必须将“角色”映射到“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”?

这是我在 MVC 客户端中的 Controller :

[Route("api/[controller]")]
public class CompaniesController : Controller
{
[HttpGet]
//[Authorize(Roles = "L1")] // This looks for the claim http://schemas.microsoft.com/ws/2008/06/identity/claims/role instead of role
public async Task<IEnumerable<Company>> GetCompaniesAsync()
{
var c = User.Identities.Count(); // 1
var nameOfExptectedRoleClaimType = User.Identities.First().RoleClaimType; // http://schemas.microsoft.com/ws/2008/06/identity/claims/role
var b0 = User.HasClaim(nameOfExptectedRoleClaimType, "L1"); // false
var b1 = User.HasClaim("role", "L1"); // true
var b2 = User.IsInRole("L1"); // false; looks for claim http://schemas.microsoft.com/ws/2008/06/identity/claims/role; used by [Authorize(Roles = "L1")]

var companies = await _crmApi.GetCompaniesAsync();

return companies;
}
}

我找到了这个答案(https://stackoverflow.com/a/34226538/272357),但我不知道如何“注册”CustomPrinciple。

最佳答案

我自己找到了答案。我必须提到我正在使用JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();以避免重命名声明名称(请参阅代码)。

由此产生的问题是 ClaimsPrinciple 仍在寻找以“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”命名的角色。

这可以通过 OpenIdConnectOptions.TokenValidationParameters 间接修复。

public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...

// Avoid claim mapping to old ms soap namespaces. Avoid replace "role" by "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
// ...

// https://leastprivilege.com/2016/08/21/why-does-my-authorize-attribute-not-work/
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role", // The role claim type is named "role" instead of "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"
}

});
}
}

关于c# - 如何在IdentityServer4/Identity中配置角色声明名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com