iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Modern Web

從實作學習ASP.NET Core - 30天的購物網站系列 第 16

【從實作學習ASP.NET Core】Day16 | 後台 | 會員的角色

建立起了會員系統,還需要更進一步幫會員加入角色設定
畢竟後台的操作如果被一般人隨便進入是會引發嚴重的資安問題的
今天就要加入幫會員加入角色,分隔出管理員一般使用者的身分


註冊角色服務

IdentityHostingStartupservices加入.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")]
讓他只能以管理員身分使用

測試

用一般使用者點選的時候就會被系統擋住了


上一篇
【從實作學習ASP.NET Core】Day15 | 後台 | 自定義使用者欄位
下一篇
【從實作學習ASP.NET Core】Day17 | 後台 | 角色的 CRUD 頁面
系列文
從實作學習ASP.NET Core - 30天的購物網站30

1 則留言

0
wesleybabytw
iT邦新手 5 級 ‧ 2021-10-20 15:27:55

UserController.cs
內容是否有少列程式碼? 會錯在 _roleManager

Yeh iT邦新手 5 級 ‧ 2021-10-22 16:43:47 檢舉

抱歉漏掉了!
userManager一樣需要先在開頭宣告

編譯有過了,謝謝。
但執行測試時,不管用那一組帳號登入,去看產品頁面時,都會跳到登入畫面。

我要留言

立即登入留言