Я пытаюсь создать свой собственный атрибут авторизации, используя Jason Web Token JWT
in. net core 2.2.
Я вызываю авторизованный API с использованием Почтальон и здесь я сталкиваюсь с двумя проблемами:
- Заявки в отправленном
JWT
сообщения не принимаются IsAuthenticated
всегда ложно в User.Identity.IsAuthenticated
.
Обратите внимание, что часть JWT
работает совершенно нормально, создается JWT
, как я хочу, с правильным Claims
, и я проверил его на https://jwt.io .
Что касается моего Startup.cs
Я использую app.UseAuthentication()
Вот как я добавляю JWTAuthentication
к services
:
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x=>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = true,
ValidateAudience = false
};
});
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();
А вот фрагмент MyCustomAuthorizationAttribute.cs
public string Permissions { get; set; } //Permission string to get from controller
public void OnAuthorization(AuthorizationFilterContext context)
{
//Validate if any permissions are passed when using attribute at controller or action level
if (string.IsNullOrEmpty(Permissions))
{
//Validation cannot take place without any permissions so returning unauthorized
context.Result = new UnauthorizedResult();
return;
}
//The below line can be used if you are reading permissions from token
var permissionsFromToken = context.HttpContext.User.Claims.Where(x => x.Type == "Permissions").Select(x => x.Value).ToList();
var requiredPermissions = Permissions.Split(','); //Multiple permissiosn can be received from controller, delimiter "," is used to get individual values
foreach (var x in requiredPermissions)
{
if (permissionsFromToken.Contains(x))
return; //User Authorized. Wihtout setting any result value and just returning is sufficent for authorizing user
}
context.Result = new UnauthorizedResult();
return;
}
Примечание: Я знаю, что этот вопрос задавался много раньше, но я пытался большинство из них, но у меня ничего не получалось .