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中基於角色的授權,內容都很簡單,淺顯易懂!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM