首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web / OWIN、SignalR和Authorization

Web / OWIN、SignalR和Authorization
EN

Stack Overflow用户
提问于 2014-04-10 13:16:49
回答 2查看 14.8K关注 0票数 28

我正在开发一个AngularJS、Web、SignalR应用程序的原型,作为VS 2013年新项目的潜在起点。

在这个阶段,我基本上使用了visual为个人用户帐户生成的固定代码。

StartUp.Auth.cs代码中有一行代码如下所示。

代码语言:javascript
复制
app.UseOAuthBearerTokens(OAuthOptions);

有了这一点,我可以向控制器添加授权属性,它可以很好地工作。

顺便说一句,我可以在JavaScript中添加一个包含令牌的标准标头,如下所示。

代码语言:javascript
复制
$http.defaults.headers.common.Authorization = 'bearer ' + access_token;

然后,我将SignalR添加到项目中。

它支持自己版本的授权属性,但在使用SignalR时无法传递自定义标头。

这是浏览器端的一个限制。

文档说,您可以将令牌作为查询字符串的一部分传递。

我在JavaScript端添加了该代码。我的SignalR代码现在包含了以下内容。

我把这个令牌传递给了“无记名令牌”。

代码语言:javascript
复制
this.connection = $.hubConnection("/TestHub", { useDefaultPath: false, qs: "bearer_token=" + token });

因此,我的问题是如何使OWIN识别令牌,现在它已经不在标题中了。

经过多次搜索,我最后添加了代码,将令牌从querystring移动到标头中。

对于我的原型,我只是在StartUp.Auth.cs的原始行上添加了一些代码。

所以,现在看起来是这样:

代码语言:javascript
复制
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管道集成的正确模式。

我似乎找不到很多关于正确方法的好信息。

EN

回答 2

Stack Overflow用户

发布于 2014-05-06 22:27:03

我用这样的一门课:

代码语言:javascript
复制
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);
    }
}

它不只是将令牌传递给报头,而是解析它并在上下文中设置它。

然后,它可以在应用程序配置中使用,如下所示:

代码语言:javascript
复制
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"))    
});

然后,以下类型的请求将其令牌未加密,用于身份验证和授权:

代码语言:javascript
复制
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
票数 19
EN

Stack Overflow用户

发布于 2014-10-24 21:12:03

我就是这样解决的

代码语言:javascript
复制
var authData = localStorageService.get('authorizationData');
var token = authData.token;
 $.signalR.ajaxDefaults.headers = { Authorization: "Bearer " + token };

服务器端代码没有更改

希望它能帮到别人

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22989209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档