Я пытаюсь реализовать пользовательские политики в веб -API .NET при использовании jwtbearertokens.
, но по какой -то причине при попытке достичь защищенных маршрутов. Эта ошибка отображается: < /p>
05:02:07 INF] Авторизация не удалась. Эти требования не были выполнены:
rolesauthorizationRequirement: user.isinrole должен быть правдой для одной из
Следующие роли: (sudo) 05:02:07 Inf] Authenticationscheme:
идентичность. Application была оспаривана. Полем 05:02:07 INF] Запрос закончил
http/1.1 Get http: // localhost: 5259/api/auth/ - 302 0 null 6.7246ms
05:02:07 Inf] Запуск http/ 1.1 Получить
http: // localhost: 5259/account/login? returnUrl =%2FAPI%2FAUTH%2F -
Application/json null
Я понимаю, что это в основном говорит, что пользователь не может быть авторизован успешно. работающий. Я даже думал, может быть, это была бессонница, которая не давала должным образом токен -носителя, но я проверял другие проекты, и они работают в указанной материи. Авторизация на основе токена. Насколько я понимаю, токен по умолчанию для авторизации это токен носителя внутри заголовков. Который получает отправку, когда вы добавляете его в бессонницу. Сама строка. Но я еще не тестировал его, так как все еще выясняю регистр и вход в конечные точки. Позвольте мне дать вам какой -то соответствующий код для вас, чтобы лучше понять мою настройку.
Код: Выделить всё
public static void ConfigureAuthentication(this IServiceCollection services, IConfiguration config)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = config["JWT:Issuer"],
ValidateAudience = false,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["JWT:Key"] ?? throw new Exception("Security Key not found within configuration")))
};
});
}
public static void ConfigureAuthorization(this IServiceCollection services, IConfiguration config)
{
services.AddAuthorization(options =>
{
options.AddPolicy("SudoPolicy", p => p.AddRequirements(
new IsSudoRequirement()
));
options.AddPolicy("SudoRole", p => p.RequireRole("Sudo"));
});
}
public static void ConfigureIdentity(this IServiceCollection services)
{
services.AddIdentity(options =>
{
options.Password.RequiredLength = 6;
}).AddEntityFrameworkStores();
}
< /code>
Это моя пользовательская политика. Это не должно было использоваться, но я решил, что попробую внедрить один и просто посмотреть, смогу ли я заставить это работать таким образом. < /P>
public class IsSudoHandler : AuthorizationHandler
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsSudoRequirement requirement)
{
if (context.User.HasClaim(c => c.Type == "Role" && c.Value.Contains("Sudo")))
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
public class IsSudoRequirement : IAuthorizationRequirement
{
public IsSudoRequirement()
{
IsSudo = true;
}
public bool IsSudo { get; }
}
< /code>
Теперь то, как я обращаюсь с возвратом токена доступа, как таковой: < /p>
public async Task CreateAccessTokenAsync(Usuario usuario)
{
var roles = await _userManager.GetRolesAsync(usuario);
var claims = new List()
{
new Claim(JwtRegisteredClaimNames.Sub, usuario.UserName!),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString())
};
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha256);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddMinutes(10),
NotBefore = DateTime.UtcNow.AddSeconds(5),
Issuer = _config["JWT:Issuer"],
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
И вот как я пытаюсь его проверить:
[HttpGet]
[Authorize("SudoRole")]
public IActionResult Test()
{
return Ok("Poto");
}
< /code>
И он бросает эту ошибку. Я пытаюсь выполнять разные политики. Используя роли. Используя претензии. Но я все еще обнаружил, почему это не работает. Может быть, я что -то не так не делаю, не делаю что -то. Я еще обнаружил, почему это дает мне указанную ошибку. < /P>
Это полное репо, если вам любопытно: github Repository < /p>
Любое руководство , ресурс или совет с тем, как решить эту проблему, а также с архитектурой и то, как структурирована программа, будет высоко ценится.
Спасибо за ваше время!
Подробнее здесь: https://stackoverflow.com/questions/794 ... re-web-api