asp.net程序通过Microsoft Azure中SAML协议实现单点登录

发布时间 2023-04-20 16:41:34作者: 黑星2003

1. 新建应用程序
登录Azure门户,进入左侧菜单“企业应用程序--所有应用程序”,点“新建应用程序”, 继续点“创建你自己的应用程序”,如下图选择和录入名称:

填好应用的名称、想要如何处理应用程序 必须选择第三个“继承未在库中找到的任何其他应用程序(非库)”,之后点“创建”按钮;

2. 单一登录设置
继续1中步骤,进入左侧菜单“单一登录”,选择单一登录方法为“SAML”,如下图:

继续,编辑“基本SAML配置”,如下图:

其中:
** 标识符(实体ID)**,从进入左侧菜单“应用注册”,双击进入该应用,进入左侧菜单“公开API”里复制,如下图:

回执URL,就是你自己web程序中用来处理响应数据的页面;

3、将用户增加到该应用中,此处不赘述;

4、idp--->sp模式测试:
4.1 操作方式如下图:

4.2 回执URL程序的处理:
如下处理仅仅解析xml,不对数据进行验签等安全方面的处理;

点击查看代码
 ` protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            string key = "SAMLResponse";
            string enCodeVal = Request.Form.GetValues(key)[0];
            string samlResponseXml = Encoding.UTF8.GetString(Convert.FromBase64String(enCodeVal));

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(samlResponseXml);
            XmlNodeList nodeList = xmlDoc.ChildNodes;//Issuer节点
            XmlNode nodeIssuer = nodeList[0];
            XmlNodeList nodeListIssuer = nodeIssuer.ChildNodes;
            string loginNo = "";
            //node.SelectSingleNode("/Assertion/Subject/NameID").InnerXml;
            foreach (XmlNode node in nodeListIssuer)
            {
                if (node.Name == "Assertion")
                {
                    XmlNodeList nodeListSubject = node.ChildNodes;
                    foreach (XmlNode nodeSub in nodeListSubject)
                    {
                        if (nodeSub.Name == "Subject")
                        {
                            loginNo = nodeSub.InnerText;
                            break;
                        }

                    }
                    break;
                }
            } 
            Response.Write("SP端收到的用户名为:" + loginNo);
        }
        catch (Exception ex)
        {
            Response.Write("异常:" + ex.Message);
        }
    }`

5、sp--->idp 模式测试:
由我网站端发起:
5.1. 请求的字符:

<samlp:AuthnRequest
  xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
  ID="{0}"
  Version="2.0" IssueInstant="2013-03-18T03:28:54.1839884Z"
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" > 
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">{1}</Issuer> 
</samlp:AuthnRequest> 

其中:
ID,Azure AD 使用此属性来填充返回的响应的 InResponseTo 属性。 ID 的开头不能是数字,因此常见的策略是在 GUID 的字符串表示形式前面加上类似于“ID”的字符串。 例如,id6c1c178c166d486687be4aaf5e482730 是有效的 ID。

Issuer,必须与 Azure AD 中云服务的一个 ServicePrincipalNames 完全匹配。 通常,此参数设置为应用程序注册期间指定的应用 ID URI。参照2中实体ID;

重定向URL,从进入左侧菜单“应用注册”后,最上面的“终结点”中获取;

5.2. 重定向后:
重定向后,浏览器跳转到微软网站,按照提示输入用户名和密码,登陆后,会重定向到4中的回调Response.aspx页面中,此页面能解析到用户名NameID;