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

Max*_*sky 29 c# openid asp.net-mvc asp.net-membership dotnetopenauth

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

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

看看DotNetOpenAuth MVC示例,我看到对FormsAuthentication系统的唯一引用是创建一个AuthCookie以后再调用FormsAuthentication.SignOut().因此,我不确定是否可以在此OpenID系统中使用ASP.NET成员资格提供程序函数,尽管示例代码调用的另一部分User.Identity.IsAuthenticated.


这个OpenID系统是否会与ASP.NET Membership Provider接口?如果没有,我能以某种方式解决这个问题吗?

如果以上是完全不可能的,我认为我的下一步行动就是滚动我自己的数据库表并手动编写代码以便从我的帐户控制器中使用它们.我注意到Stack Exchange Data Explorer采用了这种方法,但这是正确的做法吗?


编辑:只是为了确保我使用正确的术语,"ASP.NET成员资格提供程序",我指的是使用该aspnet_regsql.exe工具生成的表的提供程序.

jws*_*ple 40

他们将接口很好,但你需要做一些自定义工作.

我过去做的是这样的:

首先,我假设您有一个半工作openid实现,这意味着您可以从openid提供程序接收实际身份,但只是不知道如何处理它.

我继续使用FormsAuthentication作为后端,即使不使用它进行身份验证.

您将需要一个数据库表,允许您将FormsAuthentication用户绑定到一个或多个openid.您只需使用从openid提供程序收到的标识URL存储FormsAuthentication用户名(尚不存在).我们称这个表为AUTH

当有人使用openid检查您的站点是否存在于AUTH表中时.如果不是,你需要做两件事.调用Membership.CreateUser()传入您想要的任何生成的用户名(或者如果由openid提供的电子邮件地址).我使用密码的GUID,因为它不会被使用.同时在AUTH表中放入一个条目,将成员资格用户名映射到openid声明的身份.

当有人使用开放ID对您的站点进行身份验证并且它已经存在时,将调用FormsAuthentication.RedirectFromLoginPage,其中包含与openid关联的用户名以及所有相应的身份验证票证.

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

编辑:作为此设置的额外好处,您可以选择将来允许用户名/密码登录.

您也可以随时更换您的会员提供商.

此外,AUTH表的多对一性质允许您轻松关联多个openids.