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