2017-09-20 4 views
1

OIDCクライアントの直接URL(https://oidcclienturl.com/)、ASP.NETコアOIDC認証ミドルウェアユーザーはIdentity Server 4ログインページにリダイレクトされます。IdentityServer4のブックマークの承認URLを使用してログインした後の空白ページ

すべて動作しますが、クレデンシャルを入力してウェブアプリケーションに戻る前に、(一時状態、ノンス、クッキー...)認証URLをブラウザにブックマークとして追加することにします。

これは、後でユーザーが新しいセッションでブックマークを使用すると問題が発生します。ログインは、ユーザーが古い認証URLを使用しても有効なユーザーの資格情報を入力した後で実際に動作するように見えますが、ユーザーがWebアプリケーションにリダイレクトされると、空白のページ(https://oidcclienturl.com/signin-oidc)になります。

ブランクページがロードされた後、ユーザーは直接URL(https://oidcclienturl.com/)をブラウズして、Webアプリケーションで認証されたユーザーとして表示できます。

空白のページの原因は何ですか?

この空白のページは、ASP.NET Coreのoidc認証ミドルウェアのデフォルトのコールバックパスを正しく理解していないと、存在してはいけません。

+0

クロムのみですか? – MJK

+0

いいえいいえ、safari、firefox、chrome(iOS)で問題を再現できます。デスクトップブラウザでも。 –

+0

同じ問題を説明している誰かhttps://github.com/aspnet/Security/issues/1069 –

答えて

1

残念ながら、ログインページをブックマークするユーザーの実際の問題は、クライアントアプリケーションがログインフローを開始する必要があるOIDCによってきれいに処理されません。

これは、ユーザアカウントの作成時にIDSと呼ばれるクライアントアプリケーションに対応するアイデンティティサーバClientIdであるユーザデータテーブルにRegistrationClientIdカラムを追加することで対処しました。クライアントアプリケーションの構成では、我々は、URIのフラグメントを追加するためのカスタムProperties辞書を使用します。ユーザーがログインするときに

new Client 
{ 
    ClientId = "some_client", 
    ClientName = "Some Client", 
    ClientUri = "https://localhost:5000", 
    Properties = new Dictionary<string, string> 
    { 
     { "StartLoginFragment", "/Auth/StartLogin" } 
    } 
    // other config omitted 
}; 

、空の戻りURLは、IDSは、クライアントアプリによって呼び出されなかったことを示すので、我々はRegistrationClientIdを使用しますIClientStoreを照会する場合は、​​とStartLoginFragmentのURIを組み合わせて、結果のURIを使用してユーザーをクライアントアプリケーションにリダイレクトします。

クライアントアプリケーションでは、そのエンドポイントがOIDCサインインフローを開始します。ユーザーはすでにIDSにサインインしているため、クライアントアプリケーションの正しい場所に戻ってきます。コントローラのアクションは、次のようになります。

[HttpGet] 
public async Task StartLogin() 
{ 
    await acctsvc.SignOutAsync(); 
    await HttpContext.ChallengeAsync("oidc", 
     new AuthenticationProperties() 
     { 
      RedirectUri = "/" 
     }); 
}  

SignOutAsyncへの呼び出しは、ちょうどすべてのクライアントアプリのサインインクッキーがクリーンアップされることを保証します。私たちのカスタムアカウントサービスにはありますが、通常の "Cookie"と "oidc"スキームではHttpContext.SignOutAsyncが実行されます。通常はIDSへのサインアウトコールも発生しますが、その後のChallengeAsyncによるリダイレクトは保留中のサインアウトコールを置き換えます。

アクションがHTTP GETであるということは理論的にはこのアクションを引き起こす可能性があることを意味します。せいぜい迷惑でしょう。

IDSが単一のクライアントに対してのみ認証を処理する特殊なケースでは、その多くをスキップすることができます。返信URLのないページにある場合は、クライアントアプリケーションstart-loginに送信してください彼らがログインする前にすぐにエンドポイント。

関連する問題