Динамически добавлять авторизацию в контроллер ASP.NET Core - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть контроллер с некоторыми служебными методами, которые я использую во многих внутренних проектах.До сих пор я всегда копировал исходный файл в каждом проекте.Теперь я хочу создать пакет NuGet для этого контроллера для использования во внутреннем хранилище.

Проблема с авторизацией для этого контроллера.Я не хочу помещать определенный атрибут [Authorize()] в класс контроллера (или его действия), поскольку авторизация должна быть выбрана разработчиком, который использует пакет: в каком-то проекте контроллер может использовать каждый, в каком-то проектемогут использоваться только аутентифицированными пользователями, другие могут использоваться с пользовательской политикой.

Есть идеи о том, как достичь цели?

1 Ответ

0 голосов
/ 14 декабря 2018

Я бы добавил атрибут Authorize с принудительной политикой, которую должны реализовать все ваши пользователи.Примерно так:

[Authorise(Policy = "MyLibPolicy")]
public class LibController : Controller
{
}

Затем, исходя из своих потребностей, они могут объявить это по-разному в своем методе Configure:

Если им нужны аутентифицированные пользователи :

services.AddAuthorization(options =>
{
    options.AddPolicy("MyLibPolicy", policy =>
    {
        policy.RequireAuthenticatedUser();
    });
});

Если им нужна пользовательская политика :

services.AddAuthorization(options =>
{
    options.AddPolicy("MyLibPolicy", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireRole("SomeRole");
        // other requirements
    });
});

Если им нужен анонимный доступ :

СейчасЭто сложная часть, поскольку вы не можете создать пустую политику (для политики требуется хотя бы одно требование).

Однако вы можете создать собственное пользовательское требование (в вашем пакете Nuget), чтобы разрешить анонимный доступ.пользователи (в основном, требование, которое всегда выполняется).

public class AllowAnonymousAuthorizationRequirement : AuthorizationHandler<IAuthorizationRequirement>, IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IAuthorizationRequirement requirement)
    {
        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

Затем ваши пользователи должны будут зарегистрировать его перед использованием, например:

services.AddScoped<IAuthorizationHandler, AllowAnonymousAuthorizationRequirement>();
services.AddAuthorization(options =>
{
    options.AddPolicy("MyLibPolicy", policy =>
    {
        policy.AddRequirements(new AllowAnonymousAuthorizationRequirement());
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...