是否可以在不调用RP的情况下从身份提供商内部向依赖方退出?
我已经在MVC中实现了一个自定义STS,它在登录时向RP发出声明,并且在制作标准退出请求时,我在IP中的签名逻辑有效:
// Process signout request
SignOutRequestMessage signOutRequestMessage = (SignOutRequestMessage)WSFederationMessage.CreateFromUri(Request.Url);
// get response to invoke signout
HttpResponse signOutResponse = new HttpResponse(HttpContext.Response.Output);
但是,当我尝试在IP中执行相同操作时,此代码不起作用。
Uri uri = new Uri(string.Format("{0}://{1}/PassiveSTS?wa=wsignout1.0",request.Url.Scheme,request.Url.Host));
// Process signout request
SignOutRequestMessage signOutRequestMessage = (SignOutRequestMessage)WSFederationMessage.CreateFromUri(uri);
// get response to invoke signout
HttpResponse signOutResponse = new HttpResponse(context.Response.Output);
答案 0 :(得分:2)
一旦您的RP验证了已发布的令牌,RP将使用新的cookie建立自己的auth会话,而IP无法控制。通常,RP通过清除此cookie来处理它自己的注销,SessionAuthenitcationModule.SignOut()会这样做。
但是如果你想让你的IP结束RP会话,我认为你必须通过重定向来实现它。
答案 1 :(得分:2)
要安全地支持联合注销,您应该从身份提供商和依赖方应用程序注销。
每个身份提供商在使用身份验证cookie的持久性方面都有所不同,您需要了解IDP(STS)如何处理Fed-Signout。
此处可以找到有关ADFS的更多信息:
如果您想欺骗此过程,您可以确保STS和应用程序位于同一个域中,并将cookie域配置为相同(使用通配符cookie)。
答案 2 :(得分:-1)
我们需要在下面签署来自RP和IDP的签名
var fedModule = FederatedAuthentication.WSFederationAuthenticationModule;
fedModule.SignOut(真); Response.Redirect(new SignOutRequestMessage(new Uri(fedModule.Issuer),fedModule.Realm).WriteQueryString());