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