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

.NET Core如何避免授权策略中的重复条件设置

解决授权策略重复配置的优雅方案

你可以通过两种更优雅的方式避免重复添加AddAuthenticationSchemes和RequireAuthenticatedUser:

方案1:复用基础策略模板

先定义包含通用规则的基础策略构建器,之后每个自定义策略直接基于这个模板扩展,不用重复写通用配置:

// 定义通用基础规则
var basePolicyBuilder = new AuthorizationPolicyBuilder()
    .AddAuthenticationSchemes(Constants.Scheme)
    .RequireAuthenticatedUser();

// 基于模板创建各业务策略
options.AddPolicy("policy_01", builder =>
{
    builder.Combine(basePolicyBuilder.Build())
           .RequireClaim("client_claim01", "value01");
});

options.AddPolicy("policy_99", builder =>
{
    builder.Combine(basePolicyBuilder.Build())
           .RequireClaim("client_claim99", "value99");
});

这种方式直观可控,不需要额外扩展或自定义组件,直接复用已有API就能减少重复代码。

方案2:全局自定义策略提供器

如果希望完全隐式给所有策略自动添加通用要求,不用修改任何策略定义代码,可以自定义IAuthorizationPolicyProvider:

1. 实现自定义策略提供器

public class GlobalPolicyProvider : DefaultAuthorizationPolicyProvider
{
    private readonly AuthorizationOptions _options;

    public GlobalPolicyProvider(IOptions<AuthorizationOptions> options) 
        : base(options)
    {
        _options = options.Value;
    }

    public override async Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
    {
        // 获取原策略
        var originalPolicy = await base.GetPolicyAsync(policyName);
        if (originalPolicy == null)
            return null;

        // 给原策略追加通用要求
        var modifiedPolicy = new AuthorizationPolicyBuilder(originalPolicy)
            .AddAuthenticationSchemes(Constants.Scheme)
            .RequireAuthenticatedUser()
            .Build();

        return modifiedPolicy;
    }
}

2. 注册自定义提供器

在Program.cs或Startup.cs中替换默认的策略提供器:

services.AddSingleton<IAuthorizationPolicyProvider, GlobalPolicyProvider>();

这样所有已定义的策略(包括你现有的policy_01到policy_99)都会自动带上指定的认证方案和已认证用户要求,完全不用修改原有策略代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:15