使用OpenID(通过DotNetOpenAuth)与用户角色和其他成员资格提供程序功能

29

我正在构建一个ASP.NET MVC站点,想使用DotNetOpenAuth实现OpenID登录(完全放弃用户名/密码登录)。

目前为止,我一直在为默认的用户名/密码系统编写代码,使用ASP.NET Membership Provider,利用角色系统、配置文件系统和基本注册系统。现在,在我的迁移到OpenID时,我预见到一些问题,特别是与ASP.NET Membership Provider提供的成员身份控件的接口问题。

查看DotNetOpenAuth MVC示例,我发现唯一涉及FormsAuthentication系统的引用是创建一个AuthCookie,以及稍后调用FormsAuthentication.SignOut()。因此,我不确定是否可以使用ASP.NET Membership Provider函数与这个OpenID系统交互,虽然示例代码的另一部分调用了User.Identity.IsAuthenticated


这个OpenID系统是否能与ASP.NET Membership Provider接口?如果不能,我该如何解决?

如果上述完全不可能,我认为我的下一步行动将是只需手动编写代码来从我的账户控制器中使用它们的数据库表,即 自己设计数据库表。我注意到Stack Exchange数据查询工具采用了这种方法,但这是正确的行动方案吗?


编辑:只是为了确保我使用了正确的术语,“ASP.NET Membership Provider”是指使用由aspnet_regsql.exe工具生成的表的提供程序。

1个回答

40

它们可以很好地接口,但您需要进行一些自定义工作。

我以前做过的是:

首先,我假设您有一个半工作的 OpenID 实现,这意味着您可以从 OpenID 提供者接收实际身份,但只是不确定该怎么处理它。

即使没有使用它进行身份验证,我仍然继续使用 FormsAuthentication 作为后端。

您需要一个数据库表,允许您将 FormsAuthentication 用户与一个或多个 openid 相关联。您可以简单地存储 FormsAuthentication 用户名(尚不存在)和从 openid 提供者接收到的标识 URL。我们将称此表为 AUTH。

当某人使用 openid 对您的站点进行身份验证时,请检查它是否存在于 AUTH 表中。如果不存在,则需要执行两件事。调用 Membership.CreateUser(),传入您想要生成的任何用户名(或如果由 openid 提供的话,则为电子邮件地址)。我对密码使用 GUID,因为它不会被使用。同时,在 AUTH 表中放置一个条目,将 Membership 用户名映射到 openid 声称的标识。

当某人使用 openid 对您的站点进行身份验证并且它已经存在时,请使用与 openid 相关联的用户名调用 FormsAuthentication.RedirectFromLoginPage,并设置所有适当的身份验证票据。

现在,您可以像以前实施 openid 之前一样使用所有不错的内置安全对象。

编辑: 通过此设置的附加好处是,在将来,您可以选择允许用户名/密码登录。

您还可以随时更换成员资格提供程序。

此外,AUTH 表的多对一性质使您可以轻松地关联多个 openid。


非常棒的答案 - 今天将会实现它。非常感谢你! - Maxim Zaslavsky
是的,您仍然可以使用Membership.GetUser()。一旦您将用户名传递给RedirectFromLoginPage,您基本上就等同于通过内置登录控件发生的情况。 - jwsample
太棒了,感谢您的精彩解释。让我省去了一些时间,避免了错误 :) - Yablargo
很好的回答。+1 但是,是否需要另一个表格,或者可以利用默认的ASP.NET用户数据(GetUser())? - James Skemp
作为对自己问题的回答,我成功地使用了标准功能。这可能不是最好的方法,但我已经验证了其他服务,然后检查用户是否存在(GetUser,将userIsOnline设置为true)。如果他们不存在,则通过CreateUser创建,然后调用SignIn。这在我们的内部网站上运行良好。 - James Skemp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接