我希望您能在以下方面为我提供帮助,因为我一直在到处寻找解决方案,但不幸的是找不到任何可行的方法。简而言之:我可以在浏览器的 JWT 的有效负载中看到组和角色的声明,但它们不能在我的 .Net Core WebApi 中使用。
我们有一个应用程序作为两个 Azure 应用程序服务运行:Angular5 中的 Web 应用程序和 .net core 2.1 中的 WebApi。我们使用 Azure AD 进行身份验证,效果很好,现在还希望使用它进行基于组或角色的授权。
在 Web 应用程序中,我们使用带有隐式流的 angular-oauth2-oidc 库。
在 Azure 中,我将“groupMembershipClaims”设置为“All”,并在 Web 应用程序的应用程序清单中创建了一个角色并将用户分配给它。当我在浏览器中查看 JWT 的有效负载时,我确实看到了角色和组的声明:
{
"aud": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"iss": "https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/",
"iat": xxxxxxxxxx,
"nbf": xxxxxxxxxx,
"exp": xxxxxxxxxx,
"aio": "xxx"
"amr": [
"pwd"
],
"at_hash": "xx"
"family_name": "xxx"
"given_name": "xxx",
"groups": [
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
],
"ipaddr": "xxx.xxx.xx.x",
"name": "x",
"nonce": "x",
"oid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"roles": [
"xxxUser"
],
"sub": "xxx",
"tid": "xxx",
"unique_name": "xxx",
"upn": "xxx",
"uti": "xxx",
"ver": "1.0"
}
但是,当我想在我的 WebApi 中使用角色或组时,ClaimsPrincipal 没有声明: WebApi 中的声明。
最初,我想根据这篇博文对同样缺失的“子”进行授权:https ://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid -connect-handler/我用过:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
和/或
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("sub");
这可以使子可用,但这似乎不适用于角色或组。
我的 Startup.cs 中的代码如下:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = Configuration.GetSection("Authentication:Authority").Value;
options.Audience = Configuration.GetSection("Authentication:Audience").Value;
});
我一直在尝试各种 TokenValidationParameters 无济于事。
任何帮助将非常感激!