Контроллер, зависящий от среды, с [Авторизовать] - PullRequest
0 голосов
/ 21 сентября 2018

Чтобы пометить контроллер как требующий авторизации, вы обычно украшаете его следующим образом:

[Authorize]
public class MyController : Controller

Наша авторизация осуществляется через стороннего провайдера, и, учитывая его настройку, мы только хотим, чтобы это былоэффект в нашей производственной среде, мы не хотим, чтобы он был активным, например, в среде QA.Отключить среду в файле Startup.cs легко, но есть ли способ условно декорировать контроллеры?Я начал смотреть на политики и роли, и похоже, что это может быть взломано на работу, но есть ли лучший способ?

1 Ответ

0 голосов
/ 21 сентября 2018

Если вы используете Asp.NET Core, следуйте документации, приведенной здесь:

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.1 https://docs.microsoft.com/en-us/aspnet/core/security/authorization/dependencyinjection?view=aspnetcore-2.1

Вы можете сделать свою собственную политику следующим образом:

public class EnvironmentAuthorize : IAuthorizationRequirement
{
    public string Environment { get; set; }

    public EnvironmentAuthorize(string env)
    {
        Environment = env;
    }
}

public class EnvironmentAuthorizeHandler : AuthorizationHandler<EnvironmentAuthorize>
{
    private readonly IHostingEnvironment envionment;

    public EnvironmentAuthorizeHandler(IHostingEnvironment env)
    {
        envionment = env;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, EnvironmentAuthorize requirement)
    {
        if (requirement.Environment != envionment.EnvironmentName)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

В файле de Startup.cs:

        services.AddAuthorization(options =>
        {
            options.AddPolicy("ProductionOnly", policy =>
                policy.Requirements.Add(new EnvironmentAuthorize("Production")));
        });

        services.AddSingleton<IAuthorizationHandler, EnvironmentAuthorizeHandler>();

В контроллере:

[Authorize(Policy = "ProductionOnly")]
public class MyController : Controller

Хотя это возможно, я не могу рекомендовать это, поскольку в разных средах поведение различно действительно кошмар.

...