2016-11-14 33 views
1

私は同様の問題を読んだが、私のユースケースは見つけられていない。 AspNetIdentityフォーム認証を使用する古いMVCアプリケーションがあります。私たちは、サイトの一部をIdentityServer3 IdPを使用する新しいシステムに移行し始めています。ユーザーの見込み客からは、「古い」サイトにログインします。さらにサイトに入ると、新しいサイトにリダイレクトされる可能性があります。現時点では、新しいSSO Cookieを取得するためにSSOページに再度ログインする必要があります。我々は二重サインを緩和しようとしている。リソースオーナーフローを使用してクッキーを発行

バックエンドでは、ユーザーのアカウントは2つの認証データベース間で同期されるため、ユーザー名とパスワードは常に同期します。デュアルサインインを減らすために、私は "古い"サイトのサインインページでリソースオーナーフローを使用しようとしていましたので、まずForms Authサインインを実行し、リソースオーナーを使用して新しいシステムとの認証のためにIdentityServerにクレデンシャルを渡します。 SSOサーバーの認証が現時点で発生した場合、後で有効なCookieを持つSSOで保護されたサイトに移動したときにCookieを作成することができます。私が探している問題は、リソースオーナーメソッドがクッキーを発行していないようだということです。私は、Resource Owner認証を実行するIdentityServerホスティングWebサイト上にMVCコントローラを作成しました。 Set-Cookieが発行された場合、HttpGetコントローラの応答がブラウザに返されるように、私はこのページに新しいブラウザタブを開く "古い"サイトを持っています。リソース所有者の認証が機能し、アクセストークンを取得し、userInfo getも機能します。私は、OWIN認証マネージャを使用してClaimsIdentityとSignInを構築します。クレームプリンシパルは、ユーザーが認証されていることを示していますが、私はクッキーを取得していません。これを実現させる方法はありますか?

要約すると、「古い」システムサインインでのプレーンテキストの資格情報を使用して、それらをSSOで事前認証してCookieを取得した後、SSOサイトへのナビゲーションでログインを要求しません。

ここにリソースオーナー認証取得コントローラがあります。

public ActionResult LoginGet(string username, string password) { 
     try { 
      username = HttpUtility.UrlDecode(username); 
      password = HttpUtility.UrlDecode(password); 
      //create identityserver sso cookie as well 
      var tokenClient = new TokenClient(
       "https://localhost.fiddler:44333/core/connect/token", 
       "clientId", 
       "secret" 
       ); 
      var scopes = "openid profile sampleApi roles"; 
      var token = tokenClient.RequestResourceOwnerPasswordAsync(username, password, scopes).Result; 
      if (token != null && !String.IsNullOrWhiteSpace(token.AccessToken)) { 
       var claims = new List<Claim>(); 
       var claimsClient = new UserInfoClient(new Uri("https://localhost.fiddler:44333/core/connect/userinfo"), token.AccessToken); 
       var userInfo = claimsClient.GetAsync().Result; 
       userInfo.Claims.ToList().ForEach(t => claims.Add(new Claim(t.Item1, t.Item2))); 
       claims.Add(new Claim("token", token.AccessToken)); 
       var claimsId = new ClaimsIdentity(claims, "Cookies"); 
       Request.GetOwinContext().Authentication.SignIn(claimsId); 
       ViewBag.Worked = true; 
       ClaimsPrincipal cp = Request.GetOwinContext().Authentication.User; 
       if(cp != null) { 
        ViewBag.IsAuthed = cp.Identity.IsAuthenticated; 
       } 
       return View(); 
      } 
     } catch (Exception ex) { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     return View(); 
    } 

答えて

3

API /バックチャネルコールでのトークンエンドポイントの呼び出し。 SSO Cookieを設定するには、ブラウザをIdentityServerにリダイレクトする必要があります。

IOW - ブラウザのリダイレクトなしではできないことはできません。

+0

ありがとうDominick。リソース所有者のエンドポイントは、自分のidentityserver3ホストアプリケーション上にすでに存在し、同じホスト名を共有します。また、エンドポイントへの新しいブラウザー・タブを開くことでこれを実行しています(ブラウザーはクッキー設定を使用することができます)。そのエンドポイントはSSO Cookieを発行できますか?または、IdSvr3 OWINミドルウェアが作成するエンドポイントにそれらを送信する必要がありますか?もしそうなら、あなたはこのプロセスについていくつかの光を当てることができますか?私は既に資格情報を持っているので、SSOの資格情報を再入力する必要はありません。 – gilm0079

1

私はそれが認証のためIdentityServerにオーバー資格情報を渡すために、リソースの所有者を使用して最初の[フォーム認証のサインインを実行して、「古い」サイトのサインインページで、リソースの所有者の流れを使用しようとした二重のサインインを減らすために新しいシステムでSSOサーバーの認証が現時点で発生した場合、後で有効なCookieを持つSSOで保護されたサイトに移動したときにCookieを作成することができます。

同じホスト名内であっても、パス(ここではIdentityServer)を別のパスからクッキーにアクセスまたは設定することはできません(確かにそれをするのは難しい方法ですが、 、など)。私はSSOとそれらを事前に認証するサインインのSSOサイトへので、後でナビゲーションは、ログインを要求していないクッキーを取得するには、「古い」システムで彼らの平文の資格情報を使用して、要約するとhttps://security.stackexchange.com/q/12439

を参照してください。

これを達成するための非常に簡単な方法は、追加の認証関連情報をユーザーサービスに渡すことを許可するauthorizeエンドポイントを使用することです。 https://identityserver.github.io/Documentation/docsv2/endpoints/authorization.html。次に、IdentityServerのサインインページに着陸すると、ユーザーのIDを取得できます。IdentityServerまたはOWINミドルウェアへ をリダイレクトする際に認可エンドポイントパラメータのハッシュを含め、あなたの「古い」システムからの暗号化、ユーザーの詳細情報を

  • するか、独自のハッシュ
  • のいくつかのフォームを提供:物事をシンプルに保つために

  • カスタムUserServiceでこの追加パラメータ(ハッシュ)を取得し、ハッシュからユーザーの詳細を取得する
  • カスタムUserServiceからサインインフィールドに値を入力し、続行するユーザーフレンドリーなメッセージ - またはフォームを動的に送信するカスタムViewServiceを作成する。
    - またはカスタムLoginPage。サンプルについてを確認してください。
関連する問題