WIF, ADFS 2.0, wsignoutcleanup1.0 и wreply

Я установил веб-приложение WIF, пользовательскую 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);
}

person JGC    schedule 19.09.2013    source источник


Ответы (1)


Все, что мне было нужно для правильного поведения, — это правильный код выхода из системы. Этот код в конечном итоге вывел моего пользователя из системы и выполнил надлежащую очистку:

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

Этот код был помещен в обработчик событий моей кнопки выхода в моем приложении проверяющей стороны.

person JGC    schedule 02.10.2013