【发布时间】:2014-05-24 05:29:34
【问题描述】:
我正在开发 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 管道集成的正确模式吗?
我似乎找不到很多关于正确方法的好信息。
【问题讨论】:
-
现在可以工作了吗?这可能是我见过的最好的尝试。
-
它工作正常。只是很少有指导知道如何去做。谢谢。
-
我做了类似的事情,但我已经将它封装在一个 OWIN 中间件模块中。
-
奇怪地设置标题对我没有任何作用...我必须将 cookie 值放入上下文... if (!string.IsNullOrEmpty(bearerToken)) { context.Token = BearerToken; }
标签: c# asp.net angularjs signalr owin