首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 安全架構核心:Principal、Identity 與 IPrincipal 實作解析

     編輯:關於ASP.NET

ASP.NET 安全架構以 Principal (主體) 與 Identity (身分) 為核心。Principal = Identity + Roles + Custom Data。本文深入解析 IPrincipal、IIdentity 介面、WindowsPrincipal/FormsIdentity 實作、HttpContext.Current.User 存取方式與角色授權檢查。

核心介面定義


public interface IPrincipal
{
    IIdentity Identity { get; }
    bool IsInRole(string role);
}

public interface IIdentity
{
    string Name { get; }
    string AuthenticationType { get; }
    bool IsAuthenticated { get; }
}

常見實作類別

驗證模式Identity 類別Principal 類別備註
Windows 驗證WindowsIdentityWindowsPrincipal角色對應 Windows 群組
Forms 驗證FormsIdentityGenericPrincipal / 自訂 PrincipalTicket 儲存於 Cookie
PassportPassportIdentityPassportPrincipal已淘汰
自訂實作 IIdentity實作 IPrincipal彈性最高

程式碼存取範例


// 取得目前使用者 Principal
IPrincipal user = HttpContext.Current.User;

// 檢查是否驗證
if (user.Identity.IsAuthenticated)
{
    lblUser.Text = $"{user.Identity.Name} 已登入";
}

// 角色授權檢查
if (user.IsInRole("Admin"))
{
    // 顯示管理功能
}

// 取得 FormsIdentity 具體 Ticket
if (user.Identity is FormsIdentity fid)
{
    FormsAuthenticationTicket ticket = fid.Ticket;
    string userData = ticket.UserData; // 自訂資料 (如 UserId、權限 JSON)
}

自訂 Principal 實作 (支援豐富角色/權限)


public class CustomPrincipal : IPrincipal
{
    public IIdentity Identity { get; }
    public string[] Roles { get; }
    public int UserId { get; }
    public string[] Permissions { get; }

    public CustomPrincipal(FormsIdentity identity, string[] roles, int userId, string[] permissions)
    {
        Identity = identity;
        Roles = roles;
        UserId = userId;
        Permissions = permissions;
    }

    public bool IsInRole(string role) => Array.Exists(Roles, r => r.Equals(role, StringComparison.OrdinalIgnoreCase));

    public bool HasPermission(string perm) => Array.Exists(Permissions, p => p.Equals(perm, StringComparison.OrdinalIgnoreCase));
}

在 Global.asax 註冊自訂 Principal


protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    if (HttpContext.Current.User?.Identity is FormsIdentity fid)
    {
        // 從 Ticket.UserData 或資料庫讀取角色/權限
        string[] roles = GetRoles(fid.Ticket.Name);
        string[] perms = GetPermissions(fid.Ticket.Name);
        int userId = GetUserId(fid.Ticket.Name);

        HttpContext.Current.User = new CustomPrincipal(fid, roles, userId, perms);
        Thread.CurrentPrincipal = HttpContext.Current.User; // 同步執行緒主體
    }
}

關鍵觀念釐清

  • Identity = 「我是誰」 (姓名、驗證類型、是否驗證)。
  • Principal = 「我能做什麼」 (角色、權限、自訂資料)。
  • HttpContext.Current.User 是每個請求的 Principal,請求結束即銷毀。
  • 授權檢查優先用 user.IsInRole,避免直接比對 user.Identity.Name。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved