本文介绍了如何在ASP.net核心标识中实现基于权限的授权?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用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));
在下一步中,当用户尝试登录系统时,我将这些声明添加到我的令牌中:
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;
}
这篇关于如何在ASP.net核心标识中实现基于权限的授权?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!