Код: Выделить всё
var jwtSettings = builder.Configuration.GetSection("Jwt");
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Key"])),
RoleClaimType = ClaimTypes.Role
};
});
builder.Services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder().AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
options.AddPolicy("UserPolicy", policy => policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().RequireRole("User"));
options.AddPolicy("AdminPolicy", policy => policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().RequireRole("Admin"));
});
< /code>
Код для посева пользователей и ролей (другие пользователи были добавлены с помощью контроллера входа в систему): < /p>
async Task SeedAsync()
{
var userManager = services.GetRequiredService();
var roleManager = services.GetRequiredService();
try
{
string[] rolenames = { "Admin", "User", "Manager" };
foreach (var rolename in rolenames)
{
var result = await roleManager.FindByNameAsync(rolename);
if (result == null)
{
await roleManager.CreateAsync(new IdentityRole(rolename));
}
}
var user = new User
{
FullName = "Mohammed",
Email = "[email protected]",
UserName = "Mohammed"
};
var results = await userManager.FindByEmailAsync(user.Email);
if (results == null)
{
await userManager.CreateAsync(user, "Password123!");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
await SeedAsync();
< /code>
Вот пример метода контроллера, который я протестирован на: < /p>
// GET: api/category
[HttpGet]
[Authorize(Roles ="User")]
public async Task GetAll()
{
var categories = await _categoryService.GetAllAsync();
return Ok(categories);
}
// GET: api/category/{id}
[HttpGet("{id}")]
[Authorize("AdminPolicy")]
public async Task GetById(int id)
{
var category = await _categoryService.GetByIdAsync(id);
if (category == null)
return NotFound();
return Ok(category);
}
Код: Выделить всё
[Authorize(AuthenticationSchemes="Bearer",Roles="Admin)]
Но было бы более подходящим, если бы мне не нужно было указать схему аутентификации и просто мог выбрать роли в качестве параметра.
Подробнее здесь: https://stackoverflow.com/questions/797 ... r-does-not