在 asp.net 中使用 SAML 2.0 的 SSO
Posted
技术标签:
【中文标题】在 asp.net 中使用 SAML 2.0 的 SSO【英文标题】:SSO using SAML2.0 in asp.net 【发布时间】:2012-06-03 10:06:15 【问题描述】:我的要求是在 asp.net 中使用 SAML2.0 实现 SSO。 我确实有 2 个供应商。想要将用户从一个站点传递到另一个站点而不登录第二个站点。我以前从未使用过 SAML2.0。 谁能帮我看看我该怎么做。
【问题讨论】:
【参考方案1】:首先让我们区分协议和令牌格式。我假设您在谈论协议而不是令牌格式。但以防万一,这里有区别:
SAML 2 令牌格式。这只是您的应用程序将接受的令牌格式。 WIF 开箱即用地支持这一点。 SAML 2 协议。这是您的应用程序必须了解的 HTTP 交互才能在应用程序中获取令牌。 WIF 不支持此功能,但您可以下载一个扩展程序 (http://connect.microsoft.com/site1168/Downloads/DownloadDetails.aspx?DownloadID=36088)另一方面,您有一个场景,其中有多个身份提供者。 Wiktor 建议的书(我合着)在Federated Identity with Multiple Partners chapter 上更详细地解释了这种情况。我建议您阅读它以了解身份联合背后的概念。让我给你这篇文章的简短版本和一些实现细节。有两种方法可以解决这个问题:
在应用程序级别实现它。 WIF 将允许您信任多个身份提供者令牌(这是通过 X509 证书完成的)。然后,您必须根据 url(如 https://idp1.yourapp.com 或 https://yourapp.com/idp1)或用户选择(通过具有两个链接的主页,每个身份提供者一个链接)为每个身份提供者生成登录请求。您还必须规范来自这些身份提供者的声明(也许其中一个会向您发送“名称”声明,而另一个会发送“upn”声明)。
YourApp --> Identity Provider 1
\-> Identity Provider 2
使用所谓的“联合提供者”。这是另一台将向您的应用程序颁发令牌的服务器,它将与您的身份提供者建立信任关系。不是让您的应用程序信任这两个身份提供者,而是只信任您的联合提供者,而联合提供者将信任身份提供者。这是一条信任链。
YourApp --> Federation Provider --> Identity Provider 1
\-> Identity Provider 2
此架构允许您:
在不接触您的应用程序的情况下扩展您的身份提供者 如果您以后有第二个应用程序,您只需复制第一个应用程序的实现 您可以免费获得单点登录 您将获得一个声明转换引擎(如果您使用 ADFS 之类的工具) 如果您使用 ADFS 之类的东西,您将获得内置的 SAML 2 协议(而不必使用下面提到的扩展手动实现它)当然,缺点是您现在需要维护其他东西(ADFS 服务器)。
【讨论】:
如此精彩的总结。谢谢你。出乎意料地很难找到它浓缩到这一点。【参考方案2】:我们编写了一个非常简单的开源 C# 组件以用于 ASP.NET 应用程序:https://github.com/jitbit/AspNetSaml(包括代码示例)
它非常简短和基本,但这就是目标。无需添加庞大的第 3 方包,只需将一个简短的 C# 文件放入您的项目中,您就可以使用 SAML。这件事已经为我们工作了多年,即使在 .NET 3.x 上也是如此
[免责声明]我是贡献者之一。
附言。非常欢迎分叉和贡献。
【讨论】:
【参考方案3】:我建议您使用 Windows Identity Foundation 子系统,它可以简化处理基于 SAML 的身份验证。
这个主题相当广泛,所以你需要一本好手册,幸运的是,有一本免费的,来自 MS:
http://msdn.microsoft.com/en-us/library/ff423674.aspx
简而言之:要在两台服务器之间传递身份,其中一台应实现身份提供程序服务(安全令牌服务),第二台必须接受由第一台创建和签名的 SAML 令牌。
【讨论】:
感谢 Wiktor Zychla 为您提供宝贵的 cmets。让我看看这个。【参考方案4】:我会推荐使用 ComponentSpace。它们提供了适用于 SAML 2.0 令牌和 SAML 2.0 协议的所有用例的库。 WIF 目前不支持 SAML 2.0 协议和令牌格式,但 CTP 除外。
【讨论】:
@Ravia - 你能提供任何它说它可用的链接吗?据我所知,看到这个链接 - connect.microsoft.com/site1168/Downloads/… 它是 CTP 版本而不是 RTM。【参考方案5】:您可以为您的 asp.net 站点试用 miniOrange’s SAML SSO module。它实际上是一个 httpmodule,可以添加 SSO 作为 ASP.NET 站点的登录方法,这里的主要内容是它是一个非常简单的设置。该模块本身为 SSO 配置提供了一个管理控制台。它有助于保护我网站的私人页面不被公众访问,并且只允许我的客户用户访问存储在他的 AD 中。 我认为这可能是最适合你的。干杯!!
【讨论】:
以上是关于在 asp.net 中使用 SAML 2.0 的 SSO的主要内容,如果未能解决你的问题,请参考以下文章
在 asp.net mvc Web 应用程序中集成第三方应用程序的 SAML SSO
ASP NET API - 在不打开 Microsoft 登录页面的情况下使用 Azure AD SAML 协议对用户进行身份验证