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. layer.tips属性

    layer.tips(新加的内容,'选择节点',{time: 0, area: ['20%', '20%'], skin: 'layui-layer-rim', tips: [3, '#ffffff' ...

  2. chrome gps位置模拟设置

    chrome gps位置模拟设置 调试公众号页面定位,Edge 虽好实现方便,介于界面实在不符合我的调试习惯  遂上度娘寻觅chrome模拟GPS方法 找了好几个帖子,发现新版本已经不再试用.不得感叹 ...

  3. Koa源码分析(三) -- middleware机制的实现

    Abstract 本系列是关于Koa框架的文章,目前关注版本是Koa v1.主要分为以下几个方面: Koa源码分析(一) -- generator Koa源码分析(二) -- co的实现 Koa源码分 ...

  4. centos7 防火墙相关命令

    启动:systemctl start firewalld禁用:systemctl stop firewalld重新载入规则:firewall-cmd --reload查看所有打开的端口:firewal ...

  5. Libgdx slg游戏进程记录

    2月16日缩放居中,stage确定点击坐标,背景处理为actor 2月17日地图多次点击 2月19日stage确定点击位置(贝塞尔曲线六边形) 2月24日格式长度,读取xml属性解析btl保存 3月1 ...

  6. Selenium定位iframe动态ID

    Selenium定位iframe动态ID. 126邮箱实例 买了本虫师的书来学习selenium2自动化测试,然后写第一个实例就遇到了一些坑,好在有热心的网友提供了帮助,解决了问题 要学习seleni ...

  7. Exp 8 Web基础

    Exp 8 Web基础 20154305 齐帅 一.实践要求: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. ...

  8. 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙

    无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义       无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...

  9. 处理Word文档中所有修订

    打开现有文档进行编辑 若要打开现有文档,您可以将 Word类实例化,如以下 using 语句所示. 为此,您可以使用Open(String, Boolean) 方法打开具有指定 fileName 的字 ...

  10. 10.1牛客J题

    https://www.nowcoder.com/acm/contest/201/J Description: 给你一行括号,定义了括号合格的形式,然后Q次询问,问你这个区间内括号是否合格 Solut ...