Фильтр аутентификации не работает с фильтром авторизации в Web API - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь создать собственный фильтр аутентификации для ASP.NET Web API. Ниже приведен код моего фильтра аутентификации

public class IDPAuthenticationFilter : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var identity = new ClaimsIdentity();
        identity.AddClaim(new Claim(ClaimTypes.Name, "testUser"));
        identity.AddClaim(new Claim(ClaimTypes.Role, "client"));
        identity.AddClaim(new Claim("testUser"));
        identity.AddClaim(new Claim("APP:USERID", "50123"));

        var principal = new GenericPrincipal(identity, new string[] { });
        Thread.CurrentPrincipal = principal;
        HttpContext.Current.User = principal;

        base.OnAuthorization(actionContext);
    }
}

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

config.Filters.Add(new IDPAuthenticationFilter());

Проблема в том, что если я добавлю атрибут [System.Web.Http.Authorize] к какому-либо контроллеру, я получу 401 Несанкционированную ошибку. Я могу получить доступ к имени пользователя, используя User.Identity.Name в действии контроллера, но если я добавлю атрибут авторизации, я получу ошибку. Есть ли что-то, чего мне не хватает.

Спасибо за ваше время. Пожалуйста, добавьте комментарий, если требуется какая-либо другая информация.

1 Ответ

0 голосов
/ 04 апреля 2019

Было несколько вещей, которые я делал неправильно. Сначала мне нужно было реализовать IAuthenticationFilter вместо AuthorizationFilterAttribute

Второй способ, которым я устанавливал личность, был неверным. Ниже приведен код, который работал для меня.

public class IDPAuthenticationFilter : Attribute, IAuthenticationFilter 
{

    public bool AllowMultiple => false;

    public async Task AuthenticateAsync (HttpAuthenticationContext context, CancellationToken cancellationToken) 
    {

        HttpRequestMessage request = context.Request;
        AuthenticationHeaderValue authorization = request.Headers.Authorization;

        if (authorization == null) {
            return;
        }
        if (authorization.Scheme != "Bearer") {
            return;
        }

        var claims = new List<Claim> ();
        claims.Add (new Claim (ClaimTypes.Name, "testUser"));
        claims.Add (new Claim (ClaimTypes.Role, "client"));
        claims.Add (new Claim ("sub", "testUser"));
        claims.Add (new Claim("APP:USERID", "50123"));

        var identity = new ClaimsIdentity (claims, "Auth_Key");

        var principal = new ClaimsPrincipal (new [] { identity });
        context.Principal = principal;
        HttpContext.Current.User = context.Principal;
        Thread.CurrentPrincipal = context.Principal;

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...