如何在ASP.NET中允许多种身份validation方法?

我正在构建一个新的ASP.NET MVC应用程序(在C#中),其中一个要求是创建一个新的成员数据库。 为此,我们需要角色来管理不同类型的成员和配置文件,以管理附加到每个成员的其他元数据。 到目前为止,只需使用标准的MembershipProvider,RoleProvider和ProfileProvider作为.NET Framework的一部分提供。

但是,问题是我想允许不同的身份validation方法。 我希望帐户和登录凭据具有一对多关系(一个帐户可以附加一些登录凭据)。 例如,用户可能同时将OpenID和ActiveDirectory帐户附加到其帐户。

但是,在尝试了几种方法之后,我们选择了MembershipProvider路线(解释了它是如何实现的,如下所示)。

我的问题是,人们之前是如何做到这一点的,以及人们如何建议我接近它? 它似乎是在很多网站上实现的东西,但在这里的搜索并没有返回任何可靠的东西。

编辑:在隔夜和今天早上四处寻找好几个小时之后 – 我仍然没有意识到屠杀一个会员提供者将是最简单的选择。 有多个MembershipProviders会产生相同的效果吗?

BOUNTY EDIT:没有回复,我假设没有更好的解决方案,我发布的答案。 这是真的吗? 我正在提供奖励,试着看看是否有人对此有任何进一步的想法以及是否有更好的选择。

BOUNTY ACCEPT EDIT:我认为WIF是下面接受的答案,对于.NET 4版本和其他版本可能适用于3.5。 除此之外,也许一个被屠杀的MembershipProvider或改编的可能仍然是相关的。

在我看来,这样做的“真正方式”是使用WIF联合(Windows Identity Foundation,以前的日内瓦框架)。

这个想法是您将身份validation授权分开。 身份validation由所谓的STS(安全令牌服务)执行,它管理您要支持的所有可能的登录机制。 当用户通过身份validation后,STS会发出包含一组声明和用户身份的令牌。 此令牌被发送到网站(在本术语中称为依赖方),并且网站根据令牌中的声明确定用户可以访问的站点的哪些部分。 WIF提供从令牌中提取信息的成员资格和角色提供程序。

您可以在此处阅读有关创建声明感知网站的信息 。

这种方法的优点之一是在身份validation和授权之间分离关注点。 您的网站不需要任何复杂的成员资格和角色提供者。 此外,STS可以重复用于向用户validation您可能拥有的其他应用程序,而无需他们多次注册(有效实现单点登录)

缺点是您将不得不花一些时间研究这些概念并编写STS编码。 请注意,使用WIF对STS进行编码并不困难,但它也不是一项100%的简单任务。

如果我设法搔痒你的兴趣,我会建议你从阅读本白皮书开始 。

亲切的问候,

克劳斯

我们遵循的一个想法是创建自定义成员资格/角色/配置文件提供程序。 我们显着地定制了登录/身份validation方法,并有一个额外的登录表。 该表基本上只包含:

 LoginID (Auto-Incremental ID, PK) UserID (FK) LoginSystemID (FK) ...blah blah 

在上面,LoginSystemID是指向外部查找表的链接,该表帮助系统确定要使用的身份validation服务(例如Standard,AD,OpenID,FacebookConnect等)。

我们遇到的问题是MembershipProvider中的Username字段不能为空,而在我们的架构中,每个人都有一个UserID(这是他们的帐户名),他们没有唯一的用户名。 我们必须通过生成GUID并使用它来解决这个问题。 这当然对用户是隐藏的,而且可以显示Users表中的DisplayName属性。

这一切都是通过FormsAuthenication完成的(AD检查是通过LDAP检查完成的)。 但是,在IIS中添加了适当设置的附加层(webform),它提供了自动Windows身份validation的方法 – 我们在实例中重定向到我们认为用户可能是内部的(基于IP地址)。

使用标准框架的东西。 见http://blogs.teamb.com/craigstuntz/2009/09/09/38390/

您可以将无限数量的身份validation方法附加到一个帐户,魔术就在FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 声明