Asp.Net网站的CAS SSO,未在serviceValidate请求上接收的属性

问题描述 投票:0回答:1

我已成功为不同的客户整合CAS。但这次'samlValidate'的反应并不是始终如一地提供所需的属性。由于故障单验证响应中缺少属性,登录失败。有时当我清除浏览器历史记录时,它会在响应中接收属性。

预期回复:

<cas:serviceResponse xmlns:cas='http://www.xxxxx.xxx/tp/cas'>
    <cas:authenticationSuccess>
        <cas:user>xxxxx</cas:user>
        <cas:attributes>    
              <cas:userNumber>1234567</cas:userNumber> 
        </cas:attributes>
    </cas:authenticationSuccess>
</cas:serviceResponse>

随机收到的回复:

<cas:serviceResponse xmlns:cas='http://www.xxx.xxx/tp/cas'>
    <cas:authenticationSuccess>
        <cas:user>xxxxxx</cas:user>


    </cas:authenticationSuccess>
</cas:serviceResponse>

请注意:我们已经创建了一个自定义代码,用于将CAS与我们的Asp.Net webforms应用程序集成。

string userId = string.Empty;
            // Look for the "ticket=" after the "?" in the URL
            string tkt = HttpContext.Current.Request.QueryString["ticket"];
            // Service url is the url of the Researcher Portal
            string service ="www.xyz.com";            
            string CASHOST="https://cas.xyz.ca:8443/cas"
            // First time through there is no ticket=, so redirect to CAS login
            if (tkt == null || tkt.Length == 0)
            {
                string redir = CASHOST + "login?" +
                  "service=" + service; 
                HttpContext.Current.Response.Redirect(redir);
            }
            // Second time (back from CAS) there is a ticket= to validate
            string validateurl = CASHOST + "serviceValidate?" +
              "ticket=" + tkt + 
              "&service=" + service;
            StreamReader Reader = new StreamReader(new WebClient().OpenRead(validateurl));
            string resp = Reader.ReadToEnd();

            if (isDebuggingMode)
                sbDebugString.Append("****Response **** \n  " + resp);
            // Some boilerplate to set up the parse.
            NameTable nt = new NameTable();
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
            XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
            XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);

            string userNumber = null;

            // A very dumb use of XML. Just scan for the "userNumber". If it isn't there, it will return an empty string.
            while (reader.Read())
            {                
                if (reader.IsStartElement())
                {
                    string tag = reader.LocalName;
                    if (isDebuggingMode)
                        sbDebugString.Append("tag : " + tag + "\n");
                    if (tag == "userNumber")
                    {
                        userNumber = reader.ReadString();
                        if (isDebuggingMode)
                            sbDebugString.Append("userNumber : " + userNumber + "\n");
                    }
                }               
            }  

其中“userNumber”属性未始终接收,以便登录失败。请分享您的想法以解决此问题。先感谢您。

asp.net webforms single-sign-on cas
1个回答
0
投票

如果您的客户端应用程序未接收属性,则需要确保:

  1. 客户端正在使用能够释放属性的CAS协议版本。
  2. 以#1为基础的客户端正在访问服务票证验证的适当端点(即/p3/serviceValidate)。
  3. CAS服务器本身正在正确地解析和检索属性。
  4. CAS服务器有权在其服务注册表中向该特定客户端应用程序发布属性。

从CAS协议3开始:

在所有功能中,版本2.0和3.0之间最明显的更新是能够通过新的/ p3 / serviceValidate端点返回身份验证/用户属性。

您可能还会发现这篇文章很有用:https://apereo.github.io/2017/06/23/cas-protocol-compatibility/

© www.soinside.com 2019 - 2024. All rights reserved.