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中基于角色的授权,内容都很简单,浅显易懂!

ASP.NET Core 2.1中基于角色的授权的更多相关文章

  1. ASP.NET Identity 身份验证和基于角色的授权

    ASP.NET Identity 身份验证和基于角色的授权 阅读目录 探索身份验证与授权 使用ASP.NET Identity 身份验证 使用角色进行授权 初始化数据,Seeding 数据库 小结 在 ...

  2. ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇

    在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Ide ...

  3. Asp.net core IdentityServer4与传统基于角色的权限系统的集成

    写在前面 因为最近在忙别的,好久没水文了 今天来水一篇: 在学习或者做权限系统技术选型的过程中,经常有朋友有这样的疑问 : "IdentityServer4的能不能做到与传统基于角色的权限系 ...

  4. 在ASP.NET Core 1.0中如何发送邮件

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:目前.NET Core 1.0中并没有提供SMTP相关的类库,那么要如何从ASP.NE ...

  5. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  6. 使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

    今天,Visual Studio中没有内置工具来测试WEB API.使用浏览器,只能测试http GET请求.您需要使用Postman,SoapUI,Fiddler或Swagger等第三方工具来执行W ...

  7. ASP.NET Core 2.2中的Endpoint路由

    Endpoint路由 在ASP.NET Core 2.2中,新增了一种路由,叫做Endpoint(终结点)路由.本文将以往的路由系统称为传统路由. 本文通过源码的方式介绍传统路由和Endpoint路由 ...

  8. ASP.NET Core Web API中使用Swagger

    本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger   在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档& ...

  9. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

随机推荐

  1. 第二阶段第九次spring会议

    今天我将对软件进行宠物信息的添加. 清屏功能 private void button5_Click(object sender, EventArgs e) { textBox2.Text = &quo ...

  2. ABAP 图形练习(GFW_PRES_SHOW and GRAPH_2D)

    创建屏幕0100(元素清单中含定制控制CONTAINER和OK_CODE) 创建GUI状态100(功能键含BACK和EXIT用于返回和退出 ) 代码 *&------------------- ...

  3. Multi-pattern string match using Aho-Corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  4. 《Serverless架构-无服务单页应用开发》读后感

    本书的作者是[美]Ben Rady,译者郑赞美.简传挺,书中作者详细的介绍了如何使用html.js以及amazon提供的诸多云服务(Simple Storage Service(S3).Cognito ...

  5. formated time string for file naming

    #include <stdio.h> #include <time.h> int main() { time_t rawtime; struct tm *timeinfo; ] ...

  6. 133. leetcode-Clone Graph

    拷贝图,可以一边遍历一边拷贝 DFS class Solution { public: Node* cloneGraph(Node* node) { unordered_map<int, Nod ...

  7. vue.js 系列教程

    Vuejs——(1)入门(单向绑定.双向绑定.列表渲染.响应函数) Vuejs——(2)Vue生命周期,数据,手动挂载,指令,过滤器 Vuejs——(3)计算属性,样式和类绑定 Vuejs——(4)v ...

  8. spring mvc jsonp调用示例

    服务端代码:主要是返回的时候,返回值要用callback包装一下 /** * JSONP调用 * * @param request * @return */ @RequestMapping(" ...

  9. MySQL--Insert Buffer

    在进行数据插入时,需要将数据插入到聚集索引和非聚集索引中,而对于非聚集索引,需要先确定数据要插入的索引页,再将索引页加载到内存中进行修改,而在业务上很难保证插入数据在非聚集索引上也是连续的,因此插入操 ...

  10. 【转】Asp.NetMve移除HTTP Header中服務器信息Server、X-AspNet-Version、X-AspNetMvc-Version、X-Powered-By:ASP.NET

    默認情況下Chrome中截獲的HTTP Header信息: Cache-Control: Content-Encoding:gzip Content-Length: Content-Type:text ...