Как реализовать авторизацию на основе разрешений в ядре ASP.net? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь защитить свой webAPI с помощью Asp.net Identity Core.Теперь я хочу динамически создавать роли, а также устанавливать и удалять разрешения для них и для них и в моей панели администратора. Например,

, у меня есть этот список разрешений:

  • зарегистрировать задачу
  • назначить задачу
  • изменить состояние задачи
  • проверить состояние задачи

теперь я хочу создать разные роли и установить для них это разрешение в соответствии со своими потребностями иназначьте эти роли каждому пользователю.

Я искал в UserManager и RoleManager платформы Identity, но не было никакого способа создать эту функцию.

Есть ли какой-либо способ для реализации этой функции?Я нахожу это полезным, но это касается dotnet

1 Ответ

0 голосов
/ 01 января 2019

Я нахожу подход, использующий утверждение и политику для создания авторизации на основе разрешений в этой ссылке.

Я создаю пользовательский тип утверждения, такой как Application.Permission, а затем создайте несколько классов, как указано ниже, для определения моих разрешений:

public class CustomClaimTypes
{
    public const string Permission = "Application.Permission";
}

public static class UserPermissions
{
    public const string Add = "users.add";
    public const string Edit = "users.edit";
    public const string EditRole = "users.edit.role";
} 

, а затем я создаю Мои роли и затем назначаю эти разрешения в качестве утверждений для ролей с ключом ApplicationPermission .

await roleManager.CreateAsync(new ApplicationRole("User"));
var userRole = await roleManager.FindByNameAsync("User");
await roleManager.AddClaimAsync(userRole, new Claim(CustomClaimTypes.Permission, Permissions.User.View));    
await roleManager.AddClaimAsync(userRole, new Claim(CustomClaimTypes.Permission, Permissions.Team.View));

на следующем шаге я добавляю эти утверждения к своему токену, когда пользователь пытается войти в систему:

var roles = await _userManager.GetRolesAsync(user);
var userRoles = roles.Select(r => new Claim(ClaimTypes.Role, r)).ToArray();
var userClaims = await _userManager.GetClaimsAsync(user).ConfigureAwait(false);
var roleClaims = await GetRoleClaimsAsync(roles).ConfigureAwait(false);
var claims = new[]
             {
                 new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                 new Claim(ClaimTypes.Email, user.Email),
                 new Claim(ClaimTypes.Name, user.UserName)
             }.Union(userClaims).Union(roleClaims).Union(userRoles);

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SigningKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
    issuer: _jwtSettings.Issuer,
    audience: _jwtSettings.Audience,
    claims: claims,
    expires: DateTime.UtcNow.AddYears(1),
    signingCredentials: creds);

, затем я создаю свои политики следующим образом:

public static class PolicyTypes
{
    public static class Users
    {
        public const string Manage = "users.manage.policy";
        public const string EditRole = "users.edit.role.policy";
    }
}

затем я настраиваю свою службу авторизации в файле startup.cs в ConfigureServiceSection:

services.AddAuthorization(options =>
{
    options.AddPolicy(PolicyTypes.Users.Manage, policy => { policy.RequireClaim(CustomClaimTypes.Permission, Permissions.Users.Add); });
    options.AddPolicy(PolicyTypes.Users.EditRole, policy => { policy.RequireClaim(CustomClaimTypes.Permission, Permissions.Users.EditRole); });
}

наконец, я устанавливаю политики на своих маршрутах и ​​заканчиваю:

[Authorize(Policy = PolicyTypes.Users.Manage)]
public async Task<IEnumerable<TeamDto>> GetSubTeams(int parentId)
{
    var teams = await _teamService.GetSubTeamsAsync(parentId);
    return teams;
}
...