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

简介:

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

授权是来描述用户能够做什么的过程。例如,只允许管理员用户可以在电脑上进行软件的安装以及卸载。而非管理员用户只能使用软件而不能进行软件的安装以及卸载。它是独立的而又与验证配合使用,需要身份验证机制。对于应用程序来说,首先需要进行身份验证,然后进行进行授权。

作者:依乐祝
原文链接:https://www.cnblogs.com/yilezhu/p/9508267.html

Identity是一个会员资格系统,它允许我们将登录功能添加到我们的应用程序中,身份可能属于一个或多个角色。例如,“User1”属于“Admin”角色,“User2”属于“HR”的角色。
我们可以在我们的MVC或者Web API应用程序中的控制器上使用AuthorizeFilter特性来控制用户的访问。基于角色的授权可以检查登陆的用户是否有访问页面的权限。这里开发人员可以在他们的代码中加入角色。
下面我们使用一个例子来进行说明,我们将创建三个角色,对应的我们将建立三个用户。代码如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)  
{  
    ....  
    ....  
    app.UseMvc(routes =>  
    {  
        routes.MapRoute(  
            name: "default",  
            template: "{controller=Home}/{action=Index}/{id?}");  
    });  
  
    CreateRoles(serviceProvider).Wait();  
}  
  
private async Task CreateRoles(IServiceProvider serviceProvider)  
{  
    //initializing custom roles   
    var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();  
    var UserManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();  
    string[] roleNames = { "Admin", "User", "HR" };  
    IdentityResult roleResult;  
  
    foreach (var roleName in roleNames)  
    {  
        var roleExist = await RoleManager.RoleExistsAsync(roleName);  
        if (!roleExist)  
        {  
            //create the roles and seed them to the database: Question 1  
            roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));  
        }  
    }  
  
    IdentityUser user = await UserManager.FindByEmailAsync("jignesh@gmail.com");  
  
    if (user == null)  
    {  
        user = new IdentityUser()  
        {  
            UserName = "jignesh@gmail.com",  
            Email = "jignesh@gmail.com",  
        };  
        await UserManager.CreateAsync(user, "Test@123");  
    }  
    await UserManager.AddToRoleAsync(user, "Admin");  
  
  
    IdentityUser user1 = await UserManager.FindByEmailAsync("tejas@gmail.com");  
  
    if (user1 == null)  
    {  
        user1 = new IdentityUser()  
        {  
            UserName = "tejas@gmail.com",  
            Email = "tejas@gmail.com",  
        };  
        await UserManager.CreateAsync(user1, "Test@123");  
    }  
    await UserManager.AddToRoleAsync(user1, "User");  
  
    IdentityUser user2 = await UserManager.FindByEmailAsync("rakesh@gmail.com");  
  
    if (user2 == null)  
    {  
        user2 = new IdentityUser()  
        {  
            UserName = "rakesh@gmail.com",  
            Email = "rakesh@gmail.com",  
        };  
        await UserManager.CreateAsync(user2, "Test@123");  
    }  
    await UserManager.AddToRoleAsync(user2, "HR");  
  
}   

我们可以使用Authorize属性的Roles属性指定有权访问所请求资源的角色。例如,以下代码允许分配了“Admin”角色用户进行访问的操作方法。

[Authorize(Roles = "Admin")]  
public IActionResult OnlyAdminAccess()  
{  
    ViewData["role"] = "Admin";  
    return View("MyPage");  
} 

我们可以使用英文的逗号分割的角色列表来允许多个角色访问的方法。例如,在以下代码段中,操作方法只能由“Admin”或“User”角色的用户访问。

[Authorize(Roles = "Admin,User")]  
public IActionResult MultipleAccess()  
{  
    ViewData["role"] = "Admin";  
    return View("MyPage");  
} 

我们也可以使用如下的代码来进行多角色的访问控制

[Authorize(Roles = "Admin")]  
[Authorize(Roles = "User")]  
public IActionResult MultipleAccess()  
{  
    ViewData["role"] = "Admin";  
    return View("MyPage");  
} 

基于策略的角色检查

我们还可以创建基于策略的访问控制。我们可以使用授权服务进行策略的添加以及注册。在下面的代码中,我们创建了一个只允许具有“Admin”角色的用户才能进行访问的策略。

public void ConfigureServices(IServiceCollection services)  
{  
....  
....  
services.AddAuthorization(options =>  
   {  
       options.AddPolicy("OnlyAdminAccess", policy => policy.RequireRole("Admin"));  
   });  
} 

我们可以使用Authorize 特性的“Policy ”属性进行策略的应用

[Authorize(Policy = "OnlyAdminAccess")]  
public IActionResult PolicyExample()  
{  
    ViewData["role"] = "Admin";  
    return View("MyPage");  
} 

使用这种策略方法我们也可以在Razor页面中应用基于角色的授权。例如,如果我们有一个"Test1.cshtml"的Razor页面,而且这个页面只允许具有"Admin"角色的用户访问,我们就可以使用下面的代码进行Razor页面的授权访问控制。

public void ConfigureServices(IServiceCollection services)  
{  
    ...  
    ...  
    services.AddMvc().AddRazorPagesOptions(options =>  
    {  
        options.Conventions.AuthorizePage("/test1", "OnlyAdminAccess");  
  
  
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);  
  
    services.AddAuthorization(options =>  
    {  
        options.AddPolicy("OnlyAdminAccess", policy => policy.RequireRole("Admin"));  
    });  
}  

总结

本文是对https://www.c-sharpcorner.com/article/role-base-authorization-in-asp-net-core-2-1/ 这篇文章的翻译,讲述了ASP.NET Core 2.1中基于角色的授权,内容都很简单,浅显易懂!

目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
100 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
Web App开发 .NET 数据安全/隐私保护
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
43 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
63 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
49 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
129 0
下一篇
无影云桌面