c# - 如何在 ASP.net core Identity 中实现基于权限的授权?

标签 c# asp.net-web-api asp.net-core asp.net-identity

我正在尝试使用 asp.net Identity Core 保护我的 webAPI。现在我想动态创建角色,并在我的管理面板中设置和删除它们的权限。

例如,我有这个权限列表:

  • 注册任务
  • 分配任务
  • 更改任务状态
  • 验证任务状态

现在我想创建不同的角色并根据需要为他们设置此权限,并将这些角色分配给每个用户。

我在 Identity framework 的 UserManager 和 RoleManager 中搜索,但没有办法创建此功能。

有什么方法可以实现这个功能吗? 我找到 this有用,但这是关于 dotnet 的

最佳答案

我在 this 中找到了一种使用声明和策略来创建基于权限的授权的方法。链接。

我创建了一个自定义声明类型,例如 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));

在下一步中,当用户尝试登录系统时,我将这些声明添加到我的 token 中:

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";
    }
}

然后我在 ConfigureServiceSection 的 startup.cs 文件中设置我的授权服务:

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;
}

关于c# - 如何在 ASP.net core Identity 中实现基于权限的授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977356/

相关文章:

routes - 配置 ASP.NET Core Router 运行匹配多个中间件

c# - 根据条件循环两个 XElements

c# - 在网站上处理信用卡订阅的最佳方式是什么?

javascript - SignalR 的跨域协商请求错误

asp.net-web-api - NuGet Microsoft.AspNet.WebAPI 5.2.3 是 WebAPI 2.2 吗?

c# - 如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api

c# - 如何使用 moq 从 IConfiguration 模拟 GetConnectionString()?

c# - 在 Windows 10 中将 Datacontext 作为 CommandParameter 传递给 Viewmodel

c# - 在 C# 中访问类型库中未定义的方法

javascript - 从 mvc web api httpresponse 生成 csv 并通过 angularjs 接收它以供下载