我正在开发一个AngularJS、Web、SignalR应用程序的原型,作为VS 2013年新项目的潜在起点。
在这个阶段,我基本上使用了visual为个人用户帐户生成的固定代码。
StartUp.Auth.cs代码中有一行代码如下所示。
app.UseOAuthBearerTokens(OAuthOptions);有了这一点,我可以向控制器添加授权属性,它可以很好地工作。
顺便说一句,我可以在JavaScript中添加一个包含令牌的标准标头,如下所示。
$http.defaults.headers.common.Authorization = 'bearer ' + access_token;然后,我将SignalR添加到项目中。
它支持自己版本的授权属性,但在使用SignalR时无法传递自定义标头。
这是浏览器端的一个限制。
文档说,您可以将令牌作为查询字符串的一部分传递。
我在JavaScript端添加了该代码。我的SignalR代码现在包含了以下内容。
我把这个令牌传递给了“无记名令牌”。
this.connection = $.hubConnection("/TestHub", { useDefaultPath: false, qs: "bearer_token=" + token });因此,我的问题是如何使OWIN识别令牌,现在它已经不在标题中了。
经过多次搜索,我最后添加了代码,将令牌从querystring移动到标头中。
对于我的原型,我只是在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管道集成的正确模式。
我似乎找不到很多关于正确方法的好信息。
发布于 2014-05-06 22:27:03
我用这样的一门课:
public class OAuthTokenProvider : OAuthBearerAuthenticationProvider
{
private List<Func<IOwinRequest, string>> _locations;
private readonly Regex _bearerRegex = new Regex("((B|b)earer\\s)");
private const string AuthHeader = "Authorization";
/// <summary>
/// By Default the Token will be searched for on the "Authorization" header.
/// <para> pass additional getters that might return a token string</para>
/// </summary>
/// <param name="locations"></param>
public OAuthTokenProvider(params Func<IOwinRequest, string>[] locations)
{
_locations = locations.ToList();
//Header is used by default
_locations.Add(x => x.Headers.Get(AuthHeader));
}
public override Task RequestToken(OAuthRequestTokenContext context)
{
var getter = _locations.FirstOrDefault(x => !String.IsNullOrWhiteSpace(x(context.Request)));
if (getter != null)
{
var tokenStr = getter(context.Request);
context.Token = _bearerRegex.Replace(tokenStr, "").Trim();
}
return Task.FromResult<object>(null);
}
}它不只是将令牌传递给报头,而是解析它并在上下文中设置它。
然后,它可以在应用程序配置中使用,如下所示:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
Provider = new OAuthTokenProvider(
req => req.Query.Get("bearer_token"),
req => req.Query.Get("access_token"),
req => req.Query.Get("token"),
req => req.Headers.Get("X-Token"))
});然后,以下类型的请求将其令牌未加密,用于身份验证和授权:
GET https://www.myapp.com/authorized/endpoint?bearer_token=123ABC HTTP/1.1
GET https://www.myapp.com/authorized/endpoint?access_token=123ABC HTTP/1.1
GET https://www.myapp.com/authorized/endpoint?token=123ABC HTTP/1.1
GET https://www.myapp.com/authorized/endpoint HTTP/1.1
X-Token: 123ABC
GET https://www.myapp.com/authorized/endpoint HTTP/1.1
Authorization: 123ABC发布于 2014-10-24 21:12:03
我就是这样解决的
var authData = localStorageService.get('authorizationData');
var token = authData.token;
$.signalR.ajaxDefaults.headers = { Authorization: "Bearer " + token };服务器端代码没有更改
希望它能帮到别人
https://stackoverflow.com/questions/22989209
复制相似问题