Атрибут авторизации зависит от конфигурации среды выполнения - PullRequest
0 голосов
/ 10 октября 2019

У меня есть .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, но если я реализую пользовательскую политику, он запрещает анонимный доступ.

Какой самый простой способ разрешить анонимный доступ, если приложение работает в определенной среде?

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Если я понимаю ваш вопрос, то вы могли бы создать собственный атрибут и всегда предоставлять пользователю доступ, когда приложение работает в определенной среде?

   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()));
            });
0 голосов
/ 10 октября 2019

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

Другие предложения можно найти в этой теме

...