1

承認サーバーとシグナル リソース サーバーとして構成された自己ホスト型の OWIN アプリケーションがあります。

私のクライアントは正常にベアラー トークンを取得し、signalR ハブへの後続の呼び出しで承認のために提示しています。

次のステップは、承認サービスを分離して、独自のホストで実行できるようにすることです。まず、承認サービス コードのみを含む別の自己ホスト型アプリを作成しました。私の開発マシンではまだすべてが 1 つのソリューションになっていますが、承認サービスと signalR リソースは別のプロセスでホストされています。

認証フローは引き続き正常に機能しています。トークンはリソース サーバーに到達していますが、signalR ハブから 401 無許可を取得しています。

ASP.Net Web API でこれを解決するための多くのサポートがあり、web.config ファイルの machine.config 値を同期します。しかし、それは私のアーキテクチャではありません。HttpListener の下で自己ホスト型アプリとして実行すると、別の暗号化 (既定では DPAPI) が使用されます。

自己ホスト型アーキテクチャでこれを解決することについては、あまり議論されていないようです。私の理論では、同じマシン上の異なるプロセスの下でも、DPAPI 復号化が失敗しているため、401 が表示されます。

これを解決するための最小限のアプローチがあるかどうか、または代わりに JWT を使用するために完全にリファクタリングする必要があるかどうかを把握しようとしています。

編集:セットアップを表示するのに役立つコードを追加する

public void ConfigureOAuth(IAppBuilder app)
{
    OAuthAuthorizationServerOptions OAuthServerOptions = new       OAuthAuthorizationServerOptions()
   {
        AllowInsecureHttp = false,
        TokenEndpointPath = new PathString("/account/login"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
        Provider = new SimpleAuthorizationServerProvider()
    };
    app.UseOAuthAuthorizationServer(OAuthServerOptions);
} 

public void ConfigureOAuth(IAppBuilder app)
{
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        {
            Provider = new ApplicationOAuthBearerAuthenticationProvider(),
        });
}   
4

2 に答える 2

3

うまくいけば、他の誰かを助けるために自分のソリューションを投稿します。

デフォルトを使用するのではなく、JWT ソリューションを実装することにしました。いずれにせよ、トークンの暗号化を OS から切り離すことで、これはより優れたアーキテクチャだと思います。このチュートリアルを使用しましたhttp://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

重要なのは、チュートリアルに示されているように、トークンを暗号化するためのカスタム OAuthAuthorizationServerProvider と ISecureDataFormat を作成することでした。これは、OWIN 構成を示しているだけです。

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = false,
            TokenEndpointPath = new PathString("/account/login"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            Provider = new JwtAuthorizationServerProvider(),
            AccessTokenFormat = new CustomJwtFormat("https://foo.test.com")
        };
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
    }

直面する可能性のあるもう 1 つの問題は、トークンを SignalR に取得することです。Authorization ヘッダーの設定は、思ったほど簡単ではありません。たまたま、このチュートリアルの Cookie ベースの実装は、JWT でも見事に機能しました。 http://blog.marcinbudny.com/2014/05/authentication-with-signalr-and-oauth.html#.VmWgMXarSCd

ここでも、OWIN 構成の例を示します。

    public void ConfigureOAuth(IAppBuilder app)
    {
        //app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        //{
        //    Provider = new ApplicationOAuthBearerAuthenticationProvider()
        //});

        var issuer = "https://foo.test.com";
        var audience = "client_id";
        var secret = TextEncodings.Base64Url.Decode("ABCDEF");

        // Api controllers with an [Authorize] attribute will be validated with JWT
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { audience },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
                },
                Provider = new ApplicationOAuthBearerAuthenticationProvider()
            });

    }
于 2015-12-07T15:51:18.370 に答える