#asp.net-core #azure-active-directory #jwt
Вопрос:
ASP.NET Ядро имеет собственное сопоставление со стандартными утверждениями. Прочтите это и взгляните на этот репозиторий GitHub
Я использую Azure AD, NET5.
Проблема в том, что unique_name сопоставляется с именем, и если вам действительно повезет, вы получите два утверждения об имени. Для меня один с моим полным именем и один с моей электронной почтой.
Код для обработки повторяющихся утверждений об именах.
string email = null;
var nameClaims = httpCtx.User
.FindAll(x => x.Type.Equals(ClaimTypes.Name))
.Where(x => x.Value.Contains("@")).ToList();
if(nameClaims.Any())
{
email = nameClaims.First().Value;
}
Код для добавления авторизации.
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = openIdConnectOptions.Authority;
options.TokenValidationParameters.ValidIssuer = openIdConnectOptions.ValidIssuer;
options.TokenValidationParameters.ValidAudiences = openIdConnectOptions.ValidAudiences;
options.MapInboundClaims = true;
});
Если вы установите значение MapInboundClaims = false, то теперь будут сопоставления, и все утверждения сохранят там имена.
Это решает мою проблему с утверждением о дублировании имени, но также нарушает способ сопоставления ролей и их использования в ASP.NET Ядро.
Я хотел бы сохранить отображение по умолчанию и добавить свое собственное для типов, которые, как я знаю, отображаются неправильно. Или удалите все сопоставления и добавьте недостающие части, чтобы роли снова заработали.
Комментарии:
1. Вы можете управлять статическим
JwtSecurityTokenHandler.DefaultInboundClaimType
словарем, чтобы настроить сопоставление по умолчанию.2. «[…] но также разбейте, как роли сопоставляются и используются в ASP.NET Ядро». Это не связано с ASP.NET Ядро, но к какому утверждению по умолчанию использует ClaimsIdentity, чтобы определить, к какой роли(ролям) принадлежит пользователь. Если вы отключите сопоставление утверждений, утверждения «роль» останутся как есть, поэтому вам нужно указать стеку JWT использовать это утверждение вместо этого. Вы можете сделать это с
options.TokenValidationParameters.RoleClaimType = "role";
помощью . Вы можете сделать то жеNameClaimType
самое, если сопоставление имен также нарушено.
Ответ №1:
Вот что у меня получилось. Теперь имена утверждений не изменяются. За исключением ролей. Мне нужно было добавить имена утверждений MS, чтобы заставить роли работать в моем сопоставлении политик.
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Logging;
namespace EmployeeTrading.Server.Extensions
{
public static partial class ServiceCollectionExtensions
{
public static IServiceCollection AddBearerAuthentication(this IServiceCollection services,
OpenIdConnectOptions openIdConnectOptions)
{
#if DEBUG
IdentityModelEventSource.ShowPII = true;
#endif
// // https://mderriey.com/2019/06/23/where-are-my-jwt-claims/
// https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/a301921ff5904b2fe084c38e41c969f4b2166bcb/src/System.IdentityModel.Tokens.Jwt/ClaimTypeMapping.cs
services
.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", o =>
{
o.Authority = openIdConnectOptions.Authority;
o.TokenValidationParameters.ValidIssuer = openIdConnectOptions.ValidIssuer;
o.TokenValidationParameters.ValidAudiences = openIdConnectOptions.ValidAudiences;
o.MapInboundClaims = false;
o.TokenValidationParameters.RoleClaimType = "roles";
});
return services;
}
}
}