web-dev-qa-db-ja.com

ASP.NET Web API:URLパラメーターを使用してアクセストークン(oAuth 2.0)を渡す方法は?

私がどのように使用できるか、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...
23
mynkow

まあ-私はヘッダーの方がはるかに良い代替案であることに同意します-もちろんクエリ文字列が必要な状況もあります。 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”)
};
23
leastprivilege

したがって、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の回答を確認してください。はるかに優れたソリューションです。

11
mynkow

トークンがクエリ文字列で保護されていないため、これはひどい考えです。ヘッダーはSSLで暗号化されています。

0
0leg