Эквивалент Application_PostAuthenticateRequest в OWIN OAuth - PullRequest
0 голосов
/ 12 декабря 2018

Чтобы разрешить моему сервисному уровню доступ к текущему идентификатору пользователя в любое время, когда это необходимо, я использую Thread.CurrentPrincipal.

Сервисный уровень используется двумя интерфейсными уровнями, одним приложением MVC и одним веб-интерфейсом MVC.используется для мобильного приложения.

В веб-приложении я использую Аутентификацию по формам, а Принципал установлен в Application_PostAuthenticateRequest.Работает нормально.

В веб Api я использую Owin.Но я не могу найти способ установить этого принципала после каждой проверки подлинности с помощью токена доступа.

Я могу сделать это, когда пользователь входит в систему со своими учетными данными, переопределив GrantResourceOwnerCredentials в моем OAuthAuthorizationServerProvider или когдаон регистрирует свой токен обновления, переопределяя GrantRefreshToken в том же классе.

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

NB.Я знаю, что в моих контроллерах Api я могу получить доступ к текущему пользователю, и он настроен правильно, но я не хочу передавать его при каждом вызове на мой уровень обслуживания.

Спасибо.

1 Ответ

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

Я нашел, как его установить.

Проверка носителя не выполняется OAuthAuthorizationServerProvider.Мне пришлось реализовать пользовательский OAuthBearerAuthenticationProvider и переопределить метод ValidateIdentity:

public class MyBearerAuthenticationProvider : OAuthBearerAuthenticationProvider
{
    public override Task ValidateIdentity(OAuthValidateIdentityContext context)
    {
        Thread.CurrentPrincipal = new Principal(context.Ticket.Identity);
        return base.ValidateIdentity(context);
    }
}

и подключить этого провайдера к моему приложению с помощью:

OAuthBearerAuthenticationOptions bearerAuthenticationOptions = new OAuthBearerAuthenticationOptions()
{
    Provider = new MyBearerAuthenticationProvider()
};
app.UseOAuthBearerAuthentication(bearerAuthenticationOptions);

К сожалению Thread.CurrentPrincipalявляется нулевым в моем бизнес-уровне.Я предполагаю, что проверка токена выполняется в другом потоке, чем выполнение запроса.Поэтому мне придется изменить свой метод.

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