1

我在 .net 4.0 上使用网络表单,我真的很难让它发挥作用。我使用了来自 jasig 站点的文档——并为客户端安装了 nuget 包。

https://wiki.jasig.org/display/CASC/.Net+Cas+Client

我成功登录并从 CAS 服务器取回了一个令牌,但似乎无法对其进行身份验证。据我所知,可以调用三种不同的服务方法来验证令牌:

/证实

/服务验证

/samlValidate

validate 方法只返回一个“no”的 Web 响应,而当我调用 serverValidate 方法时,它在 XML 响应中返回一个 INVALID_TICKET 代码。我也尝试过 samlValidate 但收到 403 错误(我知道这是一个潜在的有效响应)。

我的验证代码是这样的:

 var validateurl = APPLICATION + "validate?" +
                    "ticket=" + tkt + "&" +
                    "service=" + service;


  StreamReader Reader = new StreamReader(new WebClient().OpenRead(validateurl));
  string resp = Reader.ReadToEnd();

我的 CAS 配置是:

<casClientConfig casServerLoginUrl="https://*IPSERVER*/cas/login"
                   casServerUrlPrefix="https://*IPSERVER*/cas/"
                   serverName="http://*MYSITE*/"
            notAuthorizedUrl="~/NotAuthorized.aspx"
                   cookiesRequiredUrl="~/CookiesRequired.aspx"
                   redirectAfterValidation="true" gateway="false" renew="false" singleSignOut="true"
                   ticketTimeTolerance="5000" ticketValidatorName="Cas20" proxyTicketManager="CacheProxyTicketManager"
           serviceTicketManager="CacheServiceTicketManager"
           gatewayStatusCookieName="CasGatewayStatus" />

我想它一定是某种设置,但对于我的生活,我无法弄清楚设置可能是什么。

谁能告诉我为什么我无法验证令牌?

编辑: 考虑到这一点,我更加困惑。如果正如下面的@Steven V 所说,客户端应用程序 cookie 是由 httpmodule 创建的 - 如何对任何页面进行身份验证?例如,如果我在我的客户端 (RP) 应用程序页面(例如,landing.aspx)并单击指向(IP)身份验证服务器的链接以访问受限内容(例如,restricted.aspx) - 服务器如何神奇地创建 cookie在我登录后重定向到restricted.aspx 之前在客户端上。使用WIF 我仍然需要FormsAuthentication.CreateAuthCookie()在代码中执行或类似操作。

如果我单击指向我的受限页面的链接,会发生什么情况,我会按预期重定向到(IP)CAS 服务器页面,并且在成功登录后获得无限重定向,因为大概该应用程序没有本地客户端 cookie并尝试进行身份验证,因此重定向到已经过身份验证的服务器并重定向回没有本地 cookie 的客户端,因此需要永远进行身份验证。

再次编辑:我已对此进行了进一步阅读(那里没有太多可用的内容),并发现此身份验证发生在非常低​​的级别,并且应该在页面重定向之前设置 cookie 的客户端应用程序 (RP) 上发生。这显然不会发生在我身上,我不知道如何解决问题所在。

4

1 回答 1

1

我最终不得不下载 Jasig CAS 客户端的源代码并实现一个新的票证验证器。我们使用的 IP 是 ECAS,欧盟委员会的身份验证服务,它不支持我客户的权限级别。

对于任何感兴趣的人,或者碰巧尝试连接到 ECAS 的任何人(.NET 不是他们支持的平台之一)。从 /Validation/Schema/TicketValidator 文件夹中的 .NET 客户端,您可以实现以下内容:

namespace DotNetCasClient.Validation.TicketValidator
{
    internal class ECasServiceTicketValidator : Cas20ServiceTicketValidator
    {

在 CasAuthentication.cs 文件中,您需要添加以下代码段:

        // Names for the supported ticket validators
        public const string CAS10_TICKET_VALIDATOR_NAME = "Cas10";
        public const string CAS20_TICKET_VALIDATOR_NAME = "Cas20";
        public const string ECAS_TICKET_VALIDATOR_NAME = "ECas";
        public const string SAML11_TICKET_VALIDATOR_NAME = "Saml11";

if (String.Compare(ticketValidatorName, CasClientConfiguration.CAS10_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new Cas10TicketValidator();
                        }
                        else if (String.Compare(ticketValidatorName, CasClientConfiguration.CAS20_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new Cas20ServiceTicketValidator();
                        }
                        else if (String.Compare(ticketValidatorName, CasClientConfiguration.ECAS_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new ECasServiceTicketValidator();
                        } 
                        else if (String.Compare(ticketValidatorName, CasClientConfiguration.SAML11_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new Saml11TicketValidator();
                        }

然后,在网站的 web.config 中的 casConfigClient 设置中,添加以下内容:

ticketValidatorName="ECas"

希望这可以帮助那里的人..

于 2014-06-10T15:49:06.480 回答