ASP.NET Core 中的基于角色的授权ASP.NET Core 中的基于角色的授权

引用网址:https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/roles?view=aspnetcore-2.2

创建标识时,它可能属于一个或多个角色。 例如,Tracy 可能属于管理员角色和用户角色,但 Scott 可能只属于用户角色。 如何创建和管理这些角色取决于授权过程的后备存储。 角色通过ClaimsPrincipal类的IsInRole方法向开发人员公开。

添加角色检查

基于角色的授权检查是声明性 — 的,开发人员将其嵌入到代码中、控制器或控制器内的操作,指定当前用户必须是其成员的角色才能访问请求的资源。

例如,以下代码将访问权限限制为属于角色成员的用户的任何操作 AdministrationController Administrator :

C#
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}

可以将多个角色指定为逗号分隔列表:

C#
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}

此控制器仅可供作为角色或角色成员的用户访问 HRManager Finance 。

如果应用多个属性,则访问用户必须是所有指定角色的成员;下面的示例要求用户必须是 PowerUser 和角色的成员 ControlPanelUser 。

C#
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}

您可以通过在操作级别应用其他角色授权属性来进一步限制访问权限:

C#
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

在前面的代码片段中 Administrator ,角色或角色的成员 PowerUser 可以访问控制器和 SetTime 操作,但只有角色的成员 Administrator 才能访问该 ShutDown 操作。

你还可以锁定控制器,但允许对单个操作进行匿名、未经身份验证的访问。

C#
[Authorize]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

对于 Razor 页面, AuthorizeAttribute 可以通过以下任一方法来应用:

  • 使用 约定,或
  • 将应用 AuthorizeAttribute 到 PageModel 实例:
C#
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

 重要

筛选器属性(包括 AuthorizeAttribute )只能应用于 PageModel,不能应用于特定页面处理程序方法。

基于策略的角色检查

还可以使用新策略语法来表示角色要求,开发人员可在其中将在启动时作为授权服务配置的一部分注册策略。 这通常发生在 ConfigureServices() 启动 .cs 文件中。

C#
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole",
             policy => policy.RequireRole("Administrator"));
    });
}

策略是使用属性上的属性应用的 Policy AuthorizeAttribute :

C#
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
    return View();
}

如果要在某个要求中指定多个允许的角色,则可以将它们指定为方法的参数 RequireRole :

C#
options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

此示例授权属于或角色的用户 Administrator PowerUser BackupAdministrator 。

将角色服务添加到 Identity

追加 AddRoles 以添加角色服务:

C#
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

建议的内容

  • ASP.NET Core 中的简单授权

    了解如何使用授权属性限制对 ASP.NET Core 控制器和操作的访问。

  • ASP.NET Core 简介 Identity

    Identity与 ASP.NET Core 应用一起使用。 了解如何 (RequireDigit、RequiredLength、RequiredUniqueChars 等) 设置密码要求。

     

    --------------------------------------------------------------

    基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager。

    先后解决了几个问题,终于实现了设想。

    1. 环境条件

    Asp.Net Core 1.0.1

    Microsoft.AspNetCore.Identity.EntityFrameworkCore 1.0.0

    2. 给用户添加角色(组)使用到UserManager.AddToRolesAsync(),元数据中对AddToRolesAsync的解释为:

    1. //
    2. // 摘要:
    3. // Add the specified user to the named roles.
    4. //
    5. // 参数:
    6. // user:
    7. // The user to add to the named roles.
    8. //
    9. // roles:
    10. // The name of the roles to add the user to.
    11. //
    12. // 返回结果:
    13. // The System.Threading.Tasks.Task that represents the asynchronous operation, containing
    14. // the Microsoft.AspNetCore.Identity.IdentityResult of the operation.
    15. [AsyncStateMachine(typeof(UserManager<>.<AddToRolesAsync>d__100))]
    16. public virtual Task<IdentityResult> AddToRolesAsync(TUser user, IEnumerable<string> roles);

    在我的代码中对应第一个参数的类型是AppcationUser,第二个参数应该是代表角色(组)的字符串列表;

    在controller中该行代码为:

    1. await _userManager.AddToRolesAsync(user, selectedRoles)

    在默认角色表中有两个关角色名的字段,一个是“Name”,另外一个是“NormalizedName”,如下图所示:

    经过尝试,AddToRolesAsync()中的第二个参数应该是“NormalizedName”。如果使用“Name”会出现错误。

    3. 删除用户已有角色会使用到UserManager.RemoveFromRoleAsync(),这个方法同样会使用到AddToRolesAsync()中的两个参数,使用方法与AddToRolesAsync()相同。

     
  •  
posted @ 2021-12-28 23:53  MaxBruce  阅读(370)  评论(0编辑  收藏  举报