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.
Я не мог найти много полезной информации о том, как это сделать.

Ответы на вопрос(3)

Ваш ответ на вопрос