Web API / OWIN, SignalR и авторизация
Я разрабатываю прототип приложения AngularJS, Web API, SignalR в качестве потенциальной отправной точки для нового проекта в VS 2013.
На этом этапе я в значительной степени использую стандартный код, который Visual Studio генерирует для индивидуальных учетных записей пользователей.
В коде StartUp.Auth.cs есть строка, которая выглядит следующим образом.
app.UseOAuthBearerTokens(OAuthOptions);
Имея это в виду, я могу добавить атрибут [Authorize] к контроллерам, и он работает нормально.
Кстати, с помощью angular мне удалось добавить стандартный заголовок, содержащий токен в JavaScript, следующим образом.
$http.defaults.headers.common.Authorization = 'bearer ' + access_token;
Затем я добавил SignalR в проект.
Он поддерживает собственную версию атрибута [Authorize], но при использовании 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.
Я не мог найти много полезной информации о том, как это сделать.