我的问题: [授权(角色=“L1”)和User.IsInRole(“L1”)正在寻求索赔名“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”,而不是“角色”如何IdentityServer4 /身份配置作用的声明名称
在具体的: 我已经通过以下步骤创建IdentityServer4与标准的身份数据库(http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html):
- 新建项目
- ASP.NET核心的Web应用程序(.NET核心)
- ASP.NET 1.1的核心
- Web应用程序
- 更改身份验证
- 个人用户帐户
- 添加IdentityServer4.AspNetIdentity + Config.cs + ...
然后我创建了一个MVC客户端。验证工作正常。我还得到一份索赔清单。
我使用表AspNetUsers,AspNetUserRoles和AspNetRoles为IdentityServer4配置角色。角色被添加到索赔名称为“角色”的索赔中。
如果我尝试在MVC-Client中授权我的控制器操作,似乎我的角色的声明名称是错误的。
我该如何解决冲突?我必须将“角色”映射到“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”吗?
这是我在MVC客户端控制器:
[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。
找到的答案不适用于asp.net-core,因为具有通用ClaimsPrinciple-Parameter的UserManager不存在于Microsoft.AspNetCore.Identity中。 – Nikolaus