ASP.NET Web Api:如何使用URL参数传递访问令牌(oAuth 2.0)?

23

你有没有想法,如何在URL参数中使用由默认的asp.net web api 2 OAuth 2授权机制生成的access_token。目前,我能够通过发送一个带有Authorization头的请求成功进行授权,就像这样:

Accept: application/json
Content-Type: application/json
Authorization: Bearer pADKsjwMv927u...

我想要的是通过URL参数启用授权,就像这样:

https://www.domain.com/api/MyController?access_token=pADKsjwMv927u...

我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
好的,这对我来说是新的。 - mynkow
3个回答

24

嗯,我同意标题是更好的选择,但当然还有需要使用查询字符串的情况。 OAuth2规范也定义了它。

无论如何,这个功能已经内置在Katana OAuth2中间件中:

http://leastprivilege.com/2013/10/31/retrieving-bearer-tokens-from-alternative-locations-in-katanaowin/

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
    readonly string _name;

    public QueryStringOAuthBearerProvider(string name)
    {
        _name = name;
    }

    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        var value = context.Request.Query.Get(_name);

        if (!string.IsNullOrEmpty(value))
        {
            context.Token = value;
        }

        return Task.FromResult<object>(null);
    }
}

然后:

var options = new JwtBearerAuthenticationOptions
{
    AllowedAudiences = new[] { audience },
    IssuerSecurityTokenProviders = new[]
        {
            new SymmetricKeyIssuerSecurityTokenProvider(
                issuer,
                signingKey)
        },
    Provider = new QueryStringOAuthBearerProvider(“access_token”)
};

1
很好,好多了。你能否复制并粘贴你提到的博客文章中相关的代码,这样我就可以将你的回答标记为答案。十分感谢。 - mynkow

11

因此,请前往Global.asax并添加此方法:

        void Application_BeginRequest(object sender, EventArgs e)
        {
            if (ReferenceEquals(null, HttpContext.Current.Request.Headers["Authorization"]))
            {
                var token = HttpContext.Current.Request.Params["access_token"];
                if (!String.IsNullOrEmpty(token))
                {
                    HttpContext.Current.Request.Headers.Add("Authorization", "Bearer " + token);
                }
            }
        }

更新: 请查看@leastprivilege的答案。更好的解决方案。


0

这是一个糟糕的想法,因为令牌在查询字符串中没有受到保护。它在SSL头中加密。


7
实际上,查询字符串参数在 SSL 下受到保护。https://dev59.com/I3RC5IYBdhLWcg3wW_tk - Eugenio Pace
是的,GitHub API也支持使用此方法进行身份验证 => http://developer.github.com/v3/#authentication - mynkow
5
我不知道为什么会接受这样错误的答案。显然,发布这个答案的人并不完全理解HTTP和SSL的工作原理。在查询字符串中,令牌与在HTTP头中一样受到保护。总的来说,为了避免敏感信息被Web服务器记录,在发送敏感信息时最好使用HTTP头而不是查询字符串。 - Darin Dimitrov
你说得对,Darine,我不明白这是如何工作的。但你也错了,因为正如你所看到的,@leastprivilege将被标记为答案...无论如何。 - mynkow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接