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 中出现错误(由于它们有用的错误页面,我看不到该错误。)无论我使用什么 url 进行 wreply,都会引发错误。我是否正确使用 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 回答