You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6中基于角色的自定义授权实现方案咨询

实现方案

你的需求可以通过Windows身份认证 + 自定义声明转换来实现,既保留[Authorize(Roles = "Admin")]的声明式授权写法,又能自定义逻辑映射机器账户到角色,同时支持不同机器配置不同账户名。

步骤1:启用Windows身份认证

因为应用部署在IIS且依赖本地机器账户,直接用Windows身份认证即可,无需Cookie认证或Identity用户体系。

在Program.cs中配置认证和授权服务:

var builder = WebApplication.CreateBuilder(args);

// 添加Windows身份认证
builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme);
// 添加授权服务
builder.Services.AddAuthorization();

// 注册页面控制器(根据项目类型调整)
builder.Services.AddRazorPages();

var app = builder.Build();

// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();

// 其他中间件配置
app.MapRazorPages();

app.Run();

同时在IIS站点设置中:

  • 启用Windows身份验证
  • 禁用匿名身份验证

步骤2:配置机器账户映射

为支持不同机器使用不同账户名,把Admin和User对应的机器账户名放到appsettings.json中,方便部署时修改:

{
  "KioskSettings": {
    "AdminAccount": "KioskAdmin",
    "UserAccount": "KioskUser"
  }
}

创建对应的配置模型类:

public class KioskSettings
{
    public string AdminAccount { get; set; } = string.Empty;
    public string UserAccount { get; set; } = string.Empty;
}

在Program.cs中绑定配置:

builder.Services.Configure<KioskSettings>(builder.Configuration.GetSection("KioskSettings"));

步骤3:自定义声明转换(绑定角色逻辑)

实现IClaimsTransformation接口,将当前Windows用户的账户名映射到Admin或User角色声明,让[Authorize(Roles = "Admin")]能识别授权:

public class KioskClaimsTransformer : IClaimsTransformation
{
    private readonly IOptions<KioskSettings> _kioskSettings;

    public KioskClaimsTransformer(IOptions<KioskSettings> kioskSettings)
    {
        _kioskSettings = kioskSettings;
    }

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        // 克隆当前用户主体,避免修改原始对象
        var clone = principal.Clone();
        var identity = (ClaimsIdentity)clone.Identity;

        // 提取Windows用户名(格式通常为"机器名\账户名",取账户名部分)
        var windowsUsername = identity.Name?.Split('\\').Last() ?? string.Empty;

        // 根据配置映射角色
        if (string.Equals(windowsUsername, _kioskSettings.Value.AdminAccount, StringComparison.OrdinalIgnoreCase))
        {
            identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
        }
        else if (string.Equals(windowsUsername, _kioskSettings.Value.UserAccount, StringComparison.OrdinalIgnoreCase))
        {
            identity.AddClaim(new Claim(ClaimTypes.Role, "User"));
        }

        return await Task.FromResult(clone);
    }
}

在Program.cs中注册这个转换器:

builder.Services.AddScoped<IClaimsTransformation, KioskClaimsTransformer>();

步骤4:使用声明式授权

现在可以直接用[Authorize(Roles = "Admin")]标记需要管理员权限的页面/接口:

[Authorize(Roles = "Admin")]
public class AdminPanelModel : PageModel
{
    public void OnGet()
    {
        // 仅配置的Admin账户能访问
    }
}

普通用户页面用[Authorize(Roles = "User")],或仅加[Authorize]允许所有合法机器账户访问:

[Authorize(Roles = "User")]
public class UserHomeModel : PageModel
{
    public void OnGet()
    {
        // 仅配置的User账户能访问
    }
}

关键说明

  • 这种方式复用了ASP.NET Core原生角色授权体系,无需自定义Authorize特性,完全符合你想要的[Authorize(Roles = "Admin")]写法。
  • 账户名通过配置文件管理,不同部署机器只需修改appsettings.json中的KioskSettings,无需改动代码。
  • Windows身份认证会自动获取当前登录机器的用户身份,无需额外登录页面。

内容的提问来源于stack exchange,提问作者Beachdog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:12:51