0

WIF Web アプリケーション、カスタム STS、および ADFS 2.0 インスタンスをその間にセットアップしました。アプリケーションのサインアウト プロセスを理解するのに苦労しています。現在、ユーザーがサインアウト ボタンをクリックすると、次のコードが呼び出されます。

WSFederationAuthenticationModule.FederatedSignOut(null, new Uri("https://myrelyingpartyapp.com/?wa=wsignoutcleanup1.0"));

このコードを使用すると、正常に動作します。すべての Cookie とセッションが正しく破棄されます。唯一の問題は、プロセスが終了した後、ブラウザーに小さな緑色のチェックが表示されることです。明らかに、STS のログイン ページにリダイレクトされることを望んでいます。これを達成するために、次のコードを試みました。

WSFederationAuthenticationModule.FederatedSignOut(null, new Uri("https://myrelyingpartyapp.com/?wa=wsignoutcleanup1.0&wreply=" + HttpUtility.UrlEncode("https://myrelyingpartyapp.com/Default.aspx")));

私の考えでは、wreply によってユーザーが認証されていない証明書利用者アプリにリダイレクトされ、STS ログイン ページにリダイレクトされると考えていました。代わりに、これによりADFSでエラーが発生します(エラーページが役立つため、表示できません)。wreplyに使用するURLに関係なく、エラーがスローされます。wsignoutcleanup1.0 を正しく使用していますか? 参考までに、サインイン/サインアウト要求を処理する STS のコードを次に示します。

if (action == "wsignin1.0")
{
  SignInRequestMessage signInRequestMessage = (SignInRequestMessage)WSFederationMessage.CreateFromUri(Request.Url);

  if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
  {
    SecurityTokenService securityTokenService = new CustomSecurityTokenService(CustomSecurityTokenServiceConfiguration.Current);
    SignInResponseMessage signInResponseMessage = FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest(signInRequestMessage, User as ClaimsPrincipal, securityTokenService);
    FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(signInResponseMessage, Response);
  }
  else
  {
     throw new UnauthorizedAccessException();
  }
}
else if (action == "wsignout1.0")
{
  SignOutRequestMessage signOutRequestMessage = (SignOutRequestMessage)WSFederationMessage.CreateFromUri(Request.Url);                    
  FederatedPassiveSecurityTokenServiceOperations.ProcessSignOutRequest(signOutRequestMessage, User as ClaimsPrincipal, signOutRequestMessage.Reply, Response);
}
4

1 に答える 1

0

正しい動作に必要なのは、正しいログアウト コードだけでした。このコードは最終的にユーザーをログアウトさせ、適切なクリーンアップを行いました。

var module = FederatedAuthentication.WSFederationAuthenticationModule;
module.SignOut(false);
var request = new SignOutRequestMessage(new Uri(module.Issuer), module.Realm);
Response.Redirect(request.WriteQueryString());

このコードは、証明書利用者アプリのログアウト ボタンのイベント ハンドラーに配置されました。

于 2013-10-02T21:34:24.317 に答える