Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 授权属性依赖于运行时配置_C#_Asp.net_Asp.net Core_Authorization_Asp.net Core 3.0 - Fatal编程技术网

C# 授权属性依赖于运行时配置

C# 授权属性依赖于运行时配置,c#,asp.net,asp.net-core,authorization,asp.net-core-3.0,C#,Asp.net,Asp.net Core,Authorization,Asp.net Core 3.0,我有一个.Net Core 3.0 Web API,配置如下: services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(x => {

我有一个.Net Core 3.0 Web API,配置如下:

services.AddAuthentication(x =>
  {
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  })
  .AddJwtBearer(x =>
  {
    ...
  });

services.AddAuthorizationCore(options =>
  {
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
      .RequireAuthenticatedUser()
      .Build();
  });
我在控制器中启用它,如:

[Authorize(Roles = "Admin,Technician")]
public IActionResult CreateFoo([FromBody] Foo foo)
某些api端点也使用
[AllowAnonymous]
禁用

此产品支持多个环境,一个端点需要匿名或授权,具体取决于运行时变量;目前正在使用自定义的“ASPNETCORE_环境”选项

我看到了.net安全人员的评论,但如果我实现了自定义策略,它将禁止匿名访问

如果应用程序在特定环境中运行,允许匿名访问的最简单方法是什么?

只是一个实现。您可以创建自己的实现,绕过特定环境的身份验证:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class EnvironmentSpecificAutorizeAttribute : AuthorizeAttribute
{
    public string AllowAnonymousEnvironment { get; set; }

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    {
        // if currentEnv == AllowAnonymousEnvironment 
        //    return 
        // else
        //    base.HandleUnauthorizedRequest(actionContext);
    }
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        // same logic as above
        base.OnAuthorization(actionContext);
    }

    public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        // same logic as above
        return base.OnAuthorizationAsync(actionContext, cancellationToken);
    }
}

您可能会在

中找到其他建议如果我理解您的问题,那么您可以创建一个自定义属性,并在应用程序在特定环境中运行时始终授予用户访问权限

   public class CustomEnvRequirement : AuthorizationHandler<CustomEnvRequirement>, IAuthorizationRequirement
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomEnvRequirement requirement)
        {
            string currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            // Allow Anonymous when the current env is development.
            if (currentEnv.ToLowerInvariant().Equals("development"))
            {
                context.Succeed(requirement);
            }
            else if (currentEnv.ToLowerInvariant().Equals("production"))
            {
                // TODO: add more authorization logic.

            }
            return Task.CompletedTask;
        }
    }
另外,请确保在startup.cs中对其进行配置

  services.AddAuthorization(options =>
            {
                options.AddPolicy("CustomEnv",
                    policy => policy.Requirements.Add(new CustomEnvRequirement()));
            });

我已经尝试过了,但仍然需要一个提示。这基本上是答案,但为了使其充分发挥作用,需要为DefaultPolicy创建一个新的AuthorizationPolicyBuilder,而无需RequireAuthenticatedUser。这不适用于AspNet Core,但感谢链接。Authorization属性源来自webapi,第二个链接是核心文档,为什么不适用?您可能需要覆盖core中的不同方法,但该方法是适用的。如果是的话,请随意提出编辑建议。
  services.AddAuthorization(options =>
            {
                options.AddPolicy("CustomEnv",
                    policy => policy.Requirements.Add(new CustomEnvRequirement()));
            });