WCF - SSO认证令牌和POX接口

3
这是我要做的事情。
我们有一个SSO认证服务,其他外部面向的网页和服务使用该服务来验证用户。当用户试图访问服务时,如果没有找到包含身份验证令牌的cookie,则会被重定向到SingleSignOn认证服务。认证服务完成其工作后,将用户(HTTP 302)重定向到原始URL,并在URL中加密其身份验证令牌。很好。
我如何从WCF POX服务调用它?这里没有SOAP,只有带有XML响应的HTTP GET/POST。
目前我的做法是,在每个服务方法实现方法中检查头文件的cookie。如果cookie存在,则验证auth token并处理请求。如果cookie不存在或auth token已过期,则响应为:
  WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Redirect;
  WebOperationContext.Current.OutgoingResponse.Location = string.Format( authServiceURL, returnURL );

这样做是可行的,但它并没有与任何WCF功能集成,并且需要我手动编写大量的场景代码。有没有一种方法可以使用这些类来实现这个功能:

                <serviceCredentials>
                    <issuedTokenAuthentication>
                    </issuedTokenAuthentication>

或者使用其他方式检查每个对服务的请求? 我一直在阅读像如何:创建自定义令牌这样的页面,但我不知道它如何适用于我的需求。 任何建议都将不胜感激。我正在研究这个问题,因为在我的项目开始之前我有一些时间,并且我想正确实现这个项目并尽可能多地了解WCF。

有没有人在使用WCF时使用SSO?如果是这样,你是如何实现的? - MonkeyWrench
1个回答

2

我很不愿意回答自己的问题,但我将发布我最终为此所做的事情。

我们有一个身份验证服务,我们可以将客户端重定向(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方法中将auth token放入响应消息cookie/header中。

这篇文章帮助我弄清楚了如何连接这些内容。这是最好的方法吗?不知道。但这适用于我的WCF/REST服务。它阻止所有未经身份验证的消息甚至无法到达我的ServiceContract实现,将所有请求重定向到身份验证服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接