1

次のようにメソッドOAuthAuthorizationServerProviderをオーバーライドしている場所の単純な(トラブルシューティングのみの)実装があります。GrantResourceOwnerCredentials

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
    context.SetError("invalid_grant", "The user name or password is incorrect.");
}

最初の行は CORS を有効にし、2 行目は単にコンテキストを無効にします。Chrome を使用してテストすると、これは期待どおりに機能します。トークン エンドポイントに POST すると、 400 (Bad Request)が返されます。

ただし、への参照を導入した瞬間System.Web.Helpers.Crypto、CORS が機能しなくなり、要求されたリソースに No 'Access-Control-Allow-Origin' ヘッダーが存在しません。 たとえば、上記を次のように変更すると CORS が失敗します。

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
        var salt = System.Web.Helpers.Crypto.GenerateSalt();
        context.SetError("invalid_grant", "The user name or password is incorrect.");
    }

もちろん、これは問題のトラブルシューティング中に思いついた不自然な例です。実際の G​​rantResourceOwnerCredentials では、Crypto.VerifyHashedPassword() が使用され、まったく同じ問題が発生します。また、テストとして、Crypto への呼び出しを別のクラスですばやくラップしましたが、問題は解決しません。

奇妙なバグに遭遇しましたか? これに関する任意の方向性をいただければ幸いです。

更新: さらに調査した結果、この問題は明らかに System.Web.Helpers への参照で発生することが明らかになりました。つまり、System.Web.Helpers.Crypto クラスに固有のものではありません。

4

1 に答える 1