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