Asp.net core asp.net核心覆盖默认身份验证策略

Asp.net core asp.net核心覆盖默认身份验证策略,asp.net-core,asp.net-identity,Asp.net Core,Asp.net Identity,我使用一个默认策略和一个命名策略设置授权,如下所示 services.AddAuthorization(options => { AuthorizationPolicyBuilder defaultPolicyBuilder = new AuthorizationPolicyBuilder(CertificateAuthenticationDefaults.AuthenticationScheme, JwtBearerDefa

我使用一个默认策略和一个命名策略设置授权,如下所示

    services.AddAuthorization(options =>
    {
        AuthorizationPolicyBuilder defaultPolicyBuilder = new AuthorizationPolicyBuilder(CertificateAuthenticationDefaults.AuthenticationScheme,
                JwtBearerDefaults.AuthenticationScheme, CookieAuthenticationDefaults.AuthenticationScheme);
        defaultPolicyBuilder = defaultPolicyBuilder.RequireAuthenticatedUser();
        options.DefaultPolicy = defaultPolicyBuilder.Build();

        options.AddPolicy("CertOnly", policy =>
        {
            policy.RequireAuthenticatedUser();
            policy.AddAuthenticationSchemes(CertificateAuthenticationDefaults.AuthenticationScheme);
        });
    });
基本上,默认方案将接受jwt、cookie和cert,而cert only应该只接受cert

如果我只定义了一个
[Authorize]
标记,它就可以正常工作

但是,当我在控制器级别应用
[Authorize]
标记,并希望在操作中将其覆盖为
[Authorize(Policy=“CertOnly”)]

当定义了多个Authorize属性时,看起来它正在执行OR操作,因为我现在可以使用有效的Jwt调用该操作。如果我删除控制器上的
[Authorize]
,那么我只能使用有效的证书调用它


如何将其设置为AND操作或仅覆盖默认策略?

我建议您覆盖默认策略。它可能涉及多个级别的认证。@Karney。问题是怎么做?如何同时使用默认策略和命名策略?抱歉,这么长时间以来,证书身份验证默认是针对每个请求的,请访问官网。如果当前请求仅用于证书身份验证。您可以编写中间件来确定当前请求的模式,并根据请求的路径拒绝其他身份验证模式。您可以参考官方代码(身份验证中间件)。@Karney。这是我试图避免的最后一个组合。身份验证方案提供了我需要的东西,我希望能够利用它,因为它是内置的,不需要自定义代码。另一种方法是自定义中间件,从
IAuthorizationPolicyProvider
和路由路径获取模式。然后阻止除当前身份验证方案之外的其他身份验证方案。