我正在开发一个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识别这个令牌,因为它不再在标题中了。经过多次搜索,我最终添加了一些代码,将token从查询字符串移到标题中。
对于我的原型,我只是在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);
上面的代码比较粗糙,但这只是一个原型,我只是想看看它是否能够工作,而它确实可以。
最后来到问题:
这是否是将Bearer Token授权与SignalR和OWIN管道集成的正确模式?
我似乎找不到关于正确操作方式的好信息。