【问题标题】:Jasig CAS implementation in .NET.NET 中的 Jasig CAS 实现
【发布时间】:2014-05-06 14:50:55
【问题描述】:

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

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

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

/验证

/serviceValidate

/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的客户端,因此需要永远进行身份验证。

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

【问题讨论】:

  • 您为什么要手动验证票证?在我们的 CAS 实现中,票证验证由 HttpModule 负责,然后正确设置 Identity。
  • 因为当我尝试这样做时,我通过IP成功登录,但从未回到我网站的受限内容。你是在什么阶段在本地登录的?
  • .. 你如何设置本地用户 cookie?
  • 我们的应用程序可以保护应用程序的一部分和完整的应用程序。我们使用 web.config &lt;authorization&gt; 元素来实现这一点。用户 cookie 由 Jasig 自动设置,除了编辑 web.config 之外不需要任何实现。在 github.com/Jasig/dotnet-cas-client/tree/master/ExampleWebSite 上查看 Jasig 的示例 .NET 应用程序。
  • 不幸的是我已经尝试过了,并且得到了与我的测试项目相同的行为。我怀疑服务器上可能存在一些自定义设置。由于我无法控制服务器 - 并且与运行它的人几乎没有沟通 - 我不认为我有机会轻松解决这个问题

标签: .net c#-4.0 single-sign-on cas jasig


【解决方案1】:

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

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

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

在 CasAuthentication.cs 文件中你需要添加这些 sn-ps:

        // 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"

希望这对那里的人有所帮助..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多