Пользовательское промежуточное ПО для аутентификации - как проверить, является ли запрос анонимным или авторизованным? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь написать свой собственный код промежуточного ПО для аутентификации.

В старых добрых модулях HttpModule я мог использовать "OnAuthenticateRequest", когда запрашивалась страница "Авторизация".

Мой код промежуточного программного обеспечения что-то вроде этого:

public async Task Invoke(HttpContext context)
{
    if (!context.User.Identity.IsAuthenticated)
    {
    }
}

... но это также проверит IsAuthenticated на запросы с атрибутом [AllowAnonymous].

Как я могу из своего промежуточного ПО проверить, есть ли у запроса атрибут [AllowAnonymous] или [Authorize]?

Мне нужно сделать что-то вроде ...

public async Task Invoke(HttpContext context)
{
    if (HasAuthorizeAttribute && !context.User.Identity.IsAuthenticated)
    {
    }
    await _next.Invoke(context);
}

Спасибо.

1 Ответ

1 голос
/ 08 апреля 2020

Если я понимаю, что вы имеете в виду правильно, вы ищете что-то вроде этого: вы хотите классифицировать некоторые действия в контроллере, некоторые действия могут быть выполнены после авторизации, а в противном случае.

В В этом случае вы можете установить [Authorize] и [AllowAnonymous] поверх этих действий:

public class HomeController : Controller
{
    [AllowAnonymous]
    public async Task Invoke(HttpContext context)
    {
        // all of codes here can be executed with unauthorized request(s).
        // code goes here...
    }

    [Authorized]
    public async Task Invoke_2(HttpContext context)
    {
        // all of codes here can be executed WHEN the request is authorized
        // code goes here...
    }
}

И, если вы хотите авторизовать все запросы, которые попадут на контроллер, вы можете установить [Authorize] атрибут в верхней части имени контроллера:

[Authorize]
public class HomeController : Controller
{
    // this attribute is still required when you allow anonymous request(s)
    [AllowAnonymous]
    public async Task Invoke(HttpContext context)
    {
        // all of codes here can be executed with unauthorized request(s).
        // code goes here...
    }

    // you can remove [Authorize] attribute from this action, because
    // it's authorized by default
    public async Task Invoke_2(HttpContext context)
    {
        // all of codes here can be executed WHEN the request is authorized
        // code goes here...
    }
}

Примечание: Поскольку вы работаете с Task, лучше, если вы назовете свое действие, которое заканчивается на Async, например: InvokeAsync или Invoke_2Async.

...