【问题标题】:WIF, ADFS 2.0, wsignoutcleanup1.0 and wreplyWIF、ADFS 2.0、wsignoutcleanup1.0 和 wreply
【发布时间】:2014-09-09 19:54:18
【问题描述】:

我已经设置了一个 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);
}

【问题讨论】:

    标签: asp.net single-sign-on wif adfs2.0 ws-federation


    【解决方案1】:

    正确行为所需的只是正确的注销代码。此代码最终将我的用户注销并进行了适当的清理:

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

    此代码已放入我的依赖方应用程序的注销按钮的事件处理程序中。

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 2017-06-04
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2013-01-26
      • 1970-01-01
      相关资源
      最近更新 更多