Я разрабатываю прототип приложения AngularJS, Web API, SignalR как потенциальную отправную точку для нового проекта в VS 2013.
На этом этапе я в значительной степени использую законченный код, который визуальная студия генерирует для отдельных учетных записей пользователей.
Там находится строка в коде StartUp.Auth.cs, которая выглядит так.
app.UseOAuthBearerTokens(OAuthOptions);
При этом я могу добавить атрибут [Authorize] для контроллеров, и он отлично работает.
Кстати, с angular мне удалось добавить стандартный заголовок, содержащий токен в JavaScript, следующим образом.
$http.defaults.headers.common.Authorization = 'bearer ' + access_token;
Затем я добавил SignalR в проект.
Он поддерживает собственную версию атрибута [Авторизовать], но при использовании SignalR нельзя передавать пользовательские заголовки.
Это ограничение на стороне браузера.
В документации указано, что вы можете передать токен как часть строки запроса.
Я добавил этот код со стороны JavaScript. Мой код SignalR теперь включил это.
Я передал токен как "bearer_token".
this.connection = $.hubConnection("/TestHub", { useDefaultPath: false, qs: "bearer_token=" + token });
Итак, моя проблема заключалась в том, как сделать OWIN распознать токен, теперь он больше не находится в заголовке.
После нескольких поисков я закончил добавление кода, который перенес маркер из строки запроса в заголовок.
Для моего прототипа я просто добавил небольшой код над исходной строкой в StartUp.Auth.cs.
Итак, теперь это выглядело так:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new OAuthBearerAuthenticationProvider()
{
OnRequestToken = context =>
{
if (context.Request.Path.Value.StartsWith("/TestHub"))
{
string bearerToken = context.Request.Query.Get("bearer_token");
if (bearerToken != null)
{
string[] authorization = new string[] { "bearer " + bearerToken };
context.Request.Headers.Add("Authorization", authorization);
}
}
return Task.FromResult(context);
}
}
});
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
Приведенный выше код является грубым, но это прототип, поэтому я просто хотел посмотреть, сработало ли оно, что он сделал.
Наконец, перейдем к вопросу:
Является ли это правильным шаблоном для интеграции авторизации маркера на предъявителя с помощью SignalR и конвейера OWIN.
Кажется, я не мог найти много хорошей информации о правильном способе сделать это.