2017-03-28 30 views
0

私はOWINスタートアップクラスでUmbraco 7.5を使用しています。Umbraco Web API - Cookie認証

Cookie認証を使用することには欠点がありますが、MVCとWeb APIの間でCookie認証を共有しようとしています。

私は私のOWIN起動クラスでこれを持っている:

private static void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

    CookieSecureOption secureCookieOption = CookieSecureOption.SameAsRequest; 
#if DEBUG 
    secureCookieOption = CookieSecureOption.Never; 
#endif 

    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, 
     AuthenticationMode = AuthenticationMode.Active, 
     LoginPath = new PathString("/Account/Login"), 
     CookieSecure = secureCookieOption, 
     CookieManager = new ChunkingCookieManager(), 
     Provider = new CookieAuthenticationProvider() 
     }, PipelineStage.Authenticate); 

    //configure B2C OAuth middleware 
    foreach (string policy in AppSettings.B2CPolicies) 
    { 
     app.UseOpenIdConnectAuthentication(CreateBearerOptionsFromPolicy(policy)); 
    } 

    // Use a cookie to temporarily store information about a user logging in with a third party login provider 
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
} 

これは限りUmbraco &カスタムMVCページが懸念していると正常に動作します - 現在のユーザーIDが利用可能であり、期待通りUmbracoのヘルパーメソッドが動作します。

しかし、Web APIコントローラの場合、UmbracoApiControllerまたはApiControllerから派生しても、HTTPコンテキストの現在のユーザーIDは常にnullです。私は、APIコントローラのために送信されているブラウザリクエストをチェックしています。なぜなら、これがスレッド& httpcontextのユーザIDに変換されない理由が混乱しています。誰かがそれについて何か光を当てることができる?

編集:私は私自身のカスタムクッキー 認証ミドルウェアを作成しようと、私は それを通じて呼び出しをトレースすることができるように私のカスタム実装で、標準のMS CookieAuthenticationHandlerを置き換えthis-上のいくつかの詳細情報。興味深いことに、通常のMVC ページでは、ページがロードされるとAuthenticateCoreAsyncメソッドが呼び出され、 はCookieを正常に読み取って有効な認証 チケットを返します。 Web API呼び出しでは、APIメソッドがヒットする前にAuthenticateCoreAsyncメソッドが呼び出されていません( )。

答えて

0

これは、OWINとは何の関係もなく、Web APIの初期化コードと関係がありませんでした。自己ホスティングWeb APIに必要なコードとMVCアプリケーションの一部としてWeb APIを実行するために必要なコードを混在させていました。代わりにIAppBuilder.UseWebApiの()私はGlobalConfiguration.Configure()

を使用している必要がありますので、作業コードは次のようなものになります。

public static void Configure(IAppBuilder app) 
{ 
    GlobalConfiguration.Configure(Register); 
} 

private static void Register(HttpConfiguration config) 
{ 
    ConfigureHttpRoutes(config); 

    ConfigureFormatters(config); 

    //etc... 
} 

同様の問題がthis SO questionに遭遇しましたが。