建立起了會員系統,還需要更進一步幫會員加入角色設定
畢竟後台的操作如果被一般人隨便進入是會引發嚴重的資安問題的
今天就要加入幫會員加入角色,分隔出管理員
和一般使用者
的身分
在IdentityHostingStartup
的services
加入.AddRoles<IdentityRole>()
來啟動角色
順便調整一下密碼的規範讓之後測試比較輕鬆
services.AddDefaultIdentity<OnlineShopUser>(options =>
{
options.Password.RequiredLength = 4; //密碼長度
options.Password.RequireLowercase = false; //包含小寫英文
options.Password.RequireUppercase = false; //包含大寫英文
options.Password.RequireNonAlphanumeric = false; //包含符號
options.Password.RequireDigit = false; //包含數字
})
.AddRoles<IdentityRole>() //角色
.AddEntityFrameworkStores<OnlineShopUserContext>();
首先要先在Areas/Identity/Data/
加入一個Role類別
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace OnlineShopCMS.Areas.Identity.Data
{
public class OnlineShopUserRole
{
public int Id { get; set; }
public string RoleName { get; set; }
}
}
接著新增一個新的 Controller 名為 UserController.cs
在建構子上宣告使用 roleManager
來操作角色,加入 Action RoleCreate()
並建立前端頁面
private readonly RoleManager<IdentityRole> _roleManager;
public UserController(RoleManager<IdentityRole> roleManager)
{
this._roleManager = roleManager; // 宣告roleManager
}
public IActionResult RoleCreate()
{
return View();
}
[HttpPost]
public async Task<IActionResult> RoleCreate(OnlineShopUserRole role)
{
var roleExist = await _roleManager.RoleExistsAsync(role.RoleName); //判斷角色是否已存在
if (!roleExist)
{
var result = await _roleManager.CreateAsync(new IdentityRole(role.RoleName));
}
return View();
}
透過頁面新增兩個角色:管理者Administrator
和一般使用者User
接下來在註冊頁面加入_userManager.AddToRoleAsync(user, "Administrator").Wait();
讓新帳號註冊完後直接賦予角色定位
接下來就新增一個管理者和一個一般使用者的帳號來做測試
有了角色就可以來試試看驗證機制啦
在ProductsController.cs
上面加上[Authorize(Roles = "Administrator")]
讓他只能以管理員身分使用
測試
用一般使用者點選的時候就會被系統擋住了
UserController.cs
內容是否有少列程式碼? 會錯在 _roleManager
抱歉漏掉了!
和userManager
一樣需要先在開頭宣告
編譯有過了,謝謝。
但執行測試時,不管用那一組帳號登入,去看產品頁面時,都會跳到登入畫面。