Пользовательский фильтр авторизации в .NET Core API - PullRequest
0 голосов
/ 11 марта 2019

Я хочу авторизовать пользователей перед тем, как получить доступ к любым данным, используя мой основной API, поэтому я попытался использовать аутентификацию JWT. Я успешно сгенерировал токен при входе в систему с использованием API и сохранил этот токен на стороне клиента в сеансе. Теперь, когда пользователь хочет получить доступ к любым данным с помощью API, я отправляю этот токен в заголовке в API и хочу проверить этот токен JWT. используя пользовательский фильтр авторизации. Я создал собственный фильтр авторизации и применил его к моему API GetMenu, и я могу успешно проверить этот токен, но после проверки токена в фильтре авторизации он не попадает на мой API GetMenu.

Вот мой код AccountController:

[Filters.Authorization]
[AllowAnonymous]
[HttpPost]
[Route("GetMenu")]
public IActionResult GetMenu(string clientid, int rolecode, string repcode)
{
    //further process
}

Вот мои Фильтры. Код авторизации:

public class Authorization: AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        if (!ValidateToken(filterContext.HttpContext.Request.Headers["token"]))
        {
            filterContext.Result = new UnauthorizedResult();
        }
    }
}

У меня есть точки останова для метода OnAuthorization и API-интерфейса GetMenu. Я вызываю мой GetMenu api через почтальон для тестирования, он успешно запускает его по методу OnAuthorization в Filters.Authorization и проверяет мой токен JWT и отображает код состояния: 200 в почтальоне, но после успешной проверки токена он должен попасть в GetMenu api для дальнейшего обработка данных, но это не удар. В чем может быть проблема? что мне не хватает? пожалуйста помоги.

1 Ответ

1 голос
/ 12 марта 2019

Не следует устанавливать filterContext.Result, если запрос успешно авторизован.

//
// Summary:
//     A context for authorization filters i.e. Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter
//     and Microsoft.AspNetCore.Mvc.Filters.IAsyncAuthorizationFilter implementations.
public class AuthorizationFilterContext : FilterContext
{
    //
    // Summary:
    //     Gets or sets the result of the request. Setting Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext.Result
    //     to a non-null value inside an authorization filter will short-circuit the remainder
    //     of the filter pipeline.
    public virtual IActionResult Result { get; set; }
}

Вам нужно установить Result только в случае неудачи.

public class Authorization: AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        if (!ValidateToken(filterContext.HttpContext.Request.Headers["token"]))
        {
            filterContext.Result = new UnauthorizedResult();
        }
    }
}
...