这就是我想要做的事情。
我们有一个SSO身份验证服务,其他面向外部的网页和服务用于对用户进行身份验证。用户尝试访问服务,如果未找到包含身份验证令牌的cookie,则会将其重定向到SingleSignOn身份验证服务。 auth服务可以正常工作,并使用URL中的加密身份验证令牌将用户(HTTP 302)重定向到原始URL。大。
如何从WCF POX服务调用此功能?这里没有SOAP,只是带有XML响应的HTTP GET / POST。
我目前正在做的是,在每个服务方法实现方法中,检查cookie的标头。如果cookie存在,请验证身份验证令牌并处理该请求。如果cookie不存在或身份验证令牌已过期,则回复:
WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Redirect;
WebOperationContext.Current.OutgoingResponse.Location = string.Format( authServiceURL, returnURL );
虽然有效,但未与任何WCF功能集成,并且需要我手动编写一大堆场景。有没有办法可以使用这些类来实现它:
<serviceCredentials>
<issuedTokenAuthentication>
</issuedTokenAuthentication>
或使用其他方法检查每项服务请求?
我一直在阅读How to: Create a Custom Token之类的网页,但我看不出它如何适用于我的需求。
任何建议将不胜感激。我正在研究这个问题,因为我的项目开始之前还有一段时间,我想正确实施这个项目并尽可能多地了解WCF。
答案 0 :(得分:1)
我讨厌回答我自己的问题,但我会发布我最终为此做的事情。
我们有一个身份验证服务,我们可以重定向(Http 301)客户端,在URL中附加身份验证令牌后会将它们重定向回我们的服务。使用它,这是我的服务所采取的步骤。
我添加了一个System.ServiceModel.ServiceAuthorizationManager实现,并覆盖了CheckAccessCore方法,以检查cookie / header或url中的身份验证令牌。如果找到,我将验证令牌是否有效。该方法只返回true或false,指示请求是否通过了身份验证。如果消息传递,我创建了一个IExtension对象来包含一些数据并将其添加到OperationContext扩展。
我还添加了IDispathMessageInspector的实现。这有AfterReceiveRequest和BeforeSendReply方法。我使用BeforeSendReply方法来劫持响应。如果消息未通过身份验证(在OperationContext扩展中没有我的IExtension对象),我将WebOperationContext.Current.OutgoingResponse.StatusCode设置为重定向,并将Location设置为身份验证服务的URL。
如果确实通过了身份验证,我确保身份验证令牌位于BeforeSendReply方法的响应消息cookie / header中。
This article帮助我弄清楚如何解决问题。这是最好的方法吗?不知道。但这适用于我的WCF / REST服务。它阻止所有未经身份验证的消息甚至进入我的ServiceContract实现,将所有请求重定向到身份验证服务。