c# - Azure Active Directory SSO 与 Asp.net Webforms

标签 c# asp.net azure-active-directory single-sign-on saml-2.0

我们在 .Net 3.5 中有一个 Asp.Net Webforms 应用程序,它已经有一个带有 FormsAuthentication 的身份验证模块。对于新需求,我们需要使用 Azure Active Directory 实现 SSO(SAML)。

我们已按照文章 https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/configure-single-sign-on-non-gallery-applications 在 Azure AD 中进行了必要的配置. 下一步是从 Azure AD 的 SAML 响应中检索声明值。我们使用 Firefox 中的 SAML Tracer 扩展识别了 SAML 响应。 SAML 响应屏幕截图如下。

enter image description here

如何使用 C# 在应用程序的登录页面中解析此响应并提取声明值?

最佳答案

我建议您使用 ADFS 2.0,它在声明映射方面非常有帮助,并且可以与 AD 一起使用。

http://msdn.microsoft.com/en-us/magazine/ee335705.aspx

您的应用将接收并解析在身份验证循环后返回到您的 Web 服务器的最终声明。

唯一的问题是 ADFS 只能与 AD 一起工作,因此如果我们假设所有身份提供者都基于 AD,它可以作为 IdP 工作。对于其他 LDAP,您必须寻找其他解决方案。

同样对于 SAML 响应,它是一个 XML 输入,您可以像下面这样阅读

XDocument responseDoc = XDocument.Load(@"XMLFile1.xml");
XNamespace pr = "urn:oasis:names:tc:SAML:1.0:protocol";
XNamespace ast = "urn:oasis:names:tc:SAML:1.0:assertion";


XElement status = responseDoc.Element(pr + "Response").Element(pr + "Status");
string statusCode = (string)status.Element(pr + "StatusCode").Attribute("Value");
string statusMessage = (string)status.Element(pr + "StatusMessage");

Console.WriteLine("Status code: {0}; message: {1}.", statusCode, statusMessage);

XElement attStatement = responseDoc.Element(pr + "Response").Element(ast + "Assertion").Element(ast + "AttributeStatement");
string surname = (string)attStatement.Elements(ast + "Attribute").First(a => a.Attribute("AttributeName").Value == "Surname").Element(ast + "AttributeValue");
string firstname = (string)attStatement.Elements(ast + "Attribute").First(a => a.Attribute("AttributeName").Value == "FirstName").Element(ast + "AttributeValue");
string nrn = (string)attStatement.Elements(ast + "Attribute").First(a => a.Attribute("AttributeName").Value == "NRN").Element(ast + "AttributeValue");

Console.WriteLine("First name: {0}, last name: {1}; NRN: {2}", firstname, surname, nrn);

查看此线程以获取更多信息

https://forums.asp.net/t/1490469.aspx?parse+SAML+XML+response

希望对您有所帮助。

关于c# - Azure Active Directory SSO 与 Asp.net Webforms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618815/

相关文章:

c# - DbContext 连接字符串和托管服务

c# - 有没有办法在不使用 GDI+/WinForms "Graphics"类的情况下检索设备的 DPI?

c# - Azure AD 签名 key 滚动更新

asp.net - 正则表达式排除双空格

azure - 微软图返回 "access token is empty"

azure - 在哪里可以找到订阅 ID、客户端 ID、 secret 和租户 ID 的值?

c# - 为什么同步处理单个用户对同一个 ApiController 的多次调用?

c# - ASP.NET 错误事件日志源属性的自定义值

.net - 在 .net 3.5 框架和 IIS 7.0 中使用 sqlserver session 状态时是否需要序列化属性

c# - 授权属性始终返回 401