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