Как правильно войти в систему пользователя из Owin Middleware - PullRequest
0 голосов
/ 07 февраля 2019

Я создаю собственную систему для аутентификации токенов jwt в определенных сценариях.

Когда я правильно проверил токен, у меня есть

var userIdentity = await user.CreateIdentityAsync(DefaultAuthenticationTypes.ExternalBearer);
owinContext.Authentication.User = new System.Security.Claims.ClaimsPrincipal(userIdentity);
owinContext.Authentication.SignIn(userIdentity);
System.Web.HttpContext.Current.User = owinContext.Authentication.User;
await next()

, но, похоже, это не исправляет аутентификацию, которая все еще не проходит - я считаю - на уровне Asp.Net Mvc.Поскольку я знаю, что используется HttpContext, я пытаюсь добавить это перед вызовом next()

HttpContext.Current.User = new GenericPrincipal(userIdentity, new string[0]);

Это продвигает меня дальше, но я все еще, кажется, получаю ошибку авторизации, которая может показаться (при поиске источникасообщение, которое я получаю и , где он использовал ), приходит от атрибута Web Api [Authorize].

Я бью стену настолько далеко, насколько прослеживаю исходный код .net.Единственный способ получить это сообщение - если IsAuthorized возвращает false.Но там не указаны ни роли, ни пользователи (это просто [Authorize]), и прежде чем отправиться на next(), я могу остановить отладчик и проверить, что да, есть идентификатор пользователя, и да, это IsAuthorized.

Я переопределил AuthorizeAttribute, чтобы разместить точки останова, и вижу, что к тому времени, когда он вызывается, мой actionContext ассоциируется с совершенно другим тождеством с IsAuthorized == false.Что, в свою очередь, заставляет меня задуматься, неправильно ли я вхожу в учетную запись пользователя

Итак ... am Я делаю это правильно?Что мне делать?

1 Ответ

0 голосов
/ 07 февраля 2019

Я никогда не понимал, почему, но в моем случае мне нужно подтвердить билет после входа в систему:

var userIdentity = await user.CreateIdentityAsync(DefaultAuthenticationTypes.ExternalBearer);
ctx.Authentication.SignIn(userIdentity);
AuthenticationTicket ticket = new AuthenticationTicket(userIdentity, null);
ctx.Validated(ticket);

Редактировать

Я недействительно в том же контексте.В моем случае у меня есть пользовательский поставщик аутентификации, унаследовавший Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationProvider:

public class CustomBearerAuthenticationProvider:OAuthBearerAuthenticationProvider
{
    public CustomBearerAuthenticationProvider() : base()
    {
        this.OnValidateIdentity = (context) => Task.Run(() =>
        {
            var identity = this.CreateApplicationIdentity(user);
            context.OwinContext.Authentication.SignIn(identity);
            AuthenticationTicket ticket = new AuthenticationTicket(identity, null);
            context.Validated(ticket);
        });
    }
}

context типа: Microsoft.Owin.Security.OAuth.OAuthValidateIdentityContext

...