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("[email protected]");  

    if (user == null)
    {
        user = new IdentityUser()
        {
            UserName = "[email protected]",
            Email = "[email protected]",
        };
        await UserManager.CreateAsync(user, "[email protected]");
    }
    await UserManager.AddToRoleAsync(user, "Admin");  

    IdentityUser user1 = await UserManager.FindByEmailAsync("[email protected]");  

    if (user1 == null)
    {
        user1 = new IdentityUser()
        {
            UserName = "[email protected]",
            Email = "[email protected]",
        };
        await UserManager.CreateAsync(user1, "[email protected]");
    }
    await UserManager.AddToRoleAsync(user1, "User");  

    IdentityUser user2 = await UserManager.FindByEmailAsync("[email protected]");  

    if (user2 == null)
    {
        user2 = new IdentityUser()
        {
            UserName = "[email protected]",
            Email = "[email protected]",
        };
        await UserManager.CreateAsync(user2, "[email protected]");
    }
    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中基于角色的授权,内容都很简单,浅显易懂!

原文地址:https://www.cnblogs.com/yilezhu/p/9508267.html

时间: 2024-08-29 12:16:05

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

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

ASP.NET Identity 身份验证和基于角色的授权 阅读目录 探索身份验证与授权 使用ASP.NET Identity 身份验证 使用角色进行授权 初始化数据,Seeding 数据库 小结 在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Identity 进行身份验证(Authentication)以及联合ASP.NET MVC 基于角色的授权

说说ASP.Net Core 2.0中的Razor Page

随着.net core2.0的发布,我们可以创建2.0的web应用了.2.0中新东西的出现,会让我们忘记老的东西,他就是Razor Page.下面的这篇博客将会介绍ASP.Net Core 2.0中的Razor Page. 在ASP.Net Core 2.0新特点之一就是支持Razor Page.今天的Razor Page是ASP.Net Core MVC中的一个子集.ASP.Net Core MVC 支持Razor Page意味着Razor Page应用从技术上来说就是MVC应用,同时Razo

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

HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务端接口的耦合度.很多当今流行的RESTful API开发框架,包括Spring REST,也都默认支持HAL规范,当RESTful API被调用后,服务端就会返回ContentType为application/hal+json的JSON内容,例如: { "_links": { "

asp.net core 系列 20 EF基于数据模型创建数据库

原文:asp.net core 系列 20 EF基于数据模型创建数据库 一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种code first模式.可以在Windows 上使用 Visual Studio 2017,或在 Windows.macOS 或 Linux 上使用 .NET Core CLI 来学习.已经安装了NET Core 2.1 SDK,这

ASP.NET Core Web API中使用Swagger

本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger ??在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档>也专门阐述了通过文档管理工具,来保证API文档和代码的一致性,这样更加有助于团队的协作. ??以往我们总是通过第三方平台工具来管理我们的API文档,如eolinker.在测试方面,我们也会依赖fiddler,PostMan这样的工具. ??Swagger兼具了API文档管理和测试的功能,而且保证了代码和

ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件

原文:https://www.stevejgordon.co.uk/httpclientfactory-aspnetcore-outgoing-request-middleware-pipeline-delegatinghandlers  发表于:2018年4月 先前的系列文章中我介绍了一些核心概念,并且展示了ASP.NET Core 2.1中新的IHttpClientFactory的一些示例.前面两个帖子开始已经有一段时间了,我想通过讨论带有handler的“传出请求中间件”的概念来继续本系列

避免在ASP.NET Core 3.0中为启动类注入服务

本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingEnvironment VS IHostEnvironent - .NET Core 3.0中的废弃类型 Part 3 - 避免在ASP.NET Core 3.0中为启动类注入服务(本篇) Part 4 - 将终端中间件转换为ASP.NET Core 3.0中的端点路由 Part 5 - 将集成测试的

在ASP.NET Core 2.0中使用CookieAuthentication

在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允许做什么,今天的主题就是关于在ASP.NET Core 2.0中如何使用CookieAuthentication认证. 在ASP.NET Core 2.0中使用CookieAuthentication跟在1.0中有些不同,需要在ConfigureServices和Configure中分别设置,前者我

用ASP.NET Core 1.0中实现邮件发送功能

准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试一下,何况是开源,下面是代码可实现SMTP邮件发送: using MailKit.Net.Smtp; using MailKit.Security; using MimeKit; using System.Threading.Tasks; namespace ConsoleApp1 { public