取决于运行时配置的授权属性

问题描述 投票:0回答:2

我有一个.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_ENVIRONMENT”选项。

我已经从.net安全人员处看到this评论,但是如果我实施自定义策略,则它将不允许匿名访问。

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

c# asp.net asp.net-core authorization asp.net-core-3.0
2个回答
0
投票

AuthorizeAttribute只是AuthorizationFilterAttribute的实现。您可以创建自己的实现,该实现将绕过某些环境的身份验证:

[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);
    }
}

您可能会在this thread中找到其他建议


0
投票

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

   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;
        }
    }

这是要添加的Custom属性

 [Authorize(Policy = "CustomEnv")]

        public IActionResult Index()
        {
            return this.View();
        }

此外,请确保在startup.cs中进行配置

  services.AddAuthorization(options =>
            {
                options.AddPolicy("CustomEnv",
                    policy => policy.Requirements.Add(new CustomEnvRequirement()));
            });
© www.soinside.com 2019 - 2024. All rights reserved.