Во-первых, убедитесь, что вы добавили json строку в ваш appsettings.json
, иначе вы всегда получите 401 unauthorized
:
"JwtIssuerOptions": {
"Issuer": "webApi",
"Audience": "http://localhost:5000/"
}
Чего мне не хватает? как сделать аутентификацию на основе ролей на основе учебника?
1.Если вы хотите использовать следующий способ регистрации службы:
services.AddAuthorization(options =>
options.AddPolicy("admin", policy => policy.RequireRole("admin"))
);
Атрибут authorize должен быть как показано ниже:
[Authorize(Policy = "admin")]
2.Если вы хотите использовать следующий способ:
[Authorize(Roles = "admin")]
Вам необходимо удалить службу из Startup.cs:
//services.AddAuthorization(options =>
// options.AddPolicy("admin", policy => policy.RequireRole("admin"))
//);
Тогда не забудьте добавить заявку с ролью в JwtFactory.GenerateEncodedToken
, как показано ниже:
public async Task<string> GenerateEncodedToken(string userName, ClaimsIdentity identity)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userName),
new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
identity.FindFirst(Helpers.Constants.Strings.JwtClaimIdentifiers.Rol),
identity.FindFirst(Helpers.Constants.Strings.JwtClaimIdentifiers.Id),
new Claim(ClaimTypes.Role,"admin")
};
//...
}