9

我正在尝试为我的网站实施OpenID身份验证。这里的情景:
我希望用户能够只使用OpenID的存储必要的OpenID信息

  • 登录(用户可以只获得通过访问OpenID提供商验证无需创建电子邮件地址和密码定制的账户),
  • 通过电子邮件/密码(用户通过填写​​表格在网站上注册)
  • 将开放标识附加到他/她的帐户(openid +为一个帐户的电子邮件)。

现在我不知道我应该存储什么凭证来存放开放标识。并不确定数据库架构。这里的数据库模式:当用户登录时,无论是使用OpenID /自定义成员资格

Table: Users 
UserId => PK 
... => Custom info. Not related to authentication. 

Table: Authentication 
AuthenticationId => PK 
LoginId => (when custom site membership => email address) (when openId => openid unique address) 

UserId => FK to Users. 
Provider =>(when custom site membership => "CUSTOM") (when openId => openid provider address) 
Password => filled when using custom membership. empty when using open id. 

现在,我只看验证表格,并查找证书并获得相应的用户。如果没有用户存在,我创建一个新用户并在认证表中添加一个条目。

  • 主要问题:是存储ProviderLoginId(见上述意见,看看有什么被存储在这些领域)足够的存储OpenID认证的?我是否应该存储任何其他数据,以便在用户返回时我可以根据我保存的数据对他/她进行身份验证?

  • 您是否建议使用其他更高效的方法来执行此操作?
    谢谢。

回答

5

为openid用户存储ClaimedIdentifier - 不是提供者地址。声称的标识符是OpenID协议验证的用户唯一性,也可能提供跨OpenID提供商的可移植性。另外,由于OpenID 2.0的声明标识符可能会被OpenID Connect(OpenID 2.0的未完成后继者)所弃用,因此记录OpenID提供商端点URI以及由OpenID提供的电子邮件地址也可能符合您的最佳利益。提供者在用户记录中。目前,而不是将这些用作身份验证流程的一部分,但通过记录它们,您可以稍后确定哪些电子邮件地址是您“信任”的(即,假设您决定Google声明的电子邮件地址值得信赖),以及允许用户使用该已验证的电子邮件地址将其账户迁移到OpenID Connect账户。这也可以缓解您的网站领域(通常为http://yourdomainname.com)发生变化的危险,并可能导致您的所有Google用户声明的标识符发生变化,这些变化只能通过他们的电子邮件地址真正恢复。

我也建议你为不同的auth类型使用不同的表格。这里有几个优点。最重要的一点是,从体系结构上讲,它使得在网站中引入一个安全漏洞变得更加困难,该安全漏洞可能允许某人在用户名字段中输入OpenID(例如),并输入空白密码并将其显示为数据库匹配和登录没有任何真正的认证发生。其次,它提供了一个更灵活的模型,以便您希望添加第三种身份验证机制,而不是使所有用户的“身份验证”表水平增长。例如,OAuth 2.0和“OpenID Connect”每年都会为您的站点引入新的身份验证类型,并且添加新表格以处理新类型的数据看起来更合适。

+0

我删除了'Provider'列,并添加了'bit'类型的'IsOpenId'。什么是分离认证表(用于openid和定制)的优点[而不是去除不必要的'密码'列openid认证]? – Kamyar

+2

我加强了我对你的回答。 –

+0

完美!谢谢。 – Kamyar

1

我们只是存储openid声明url。您可能希望向提供者请求其他信息,例如用户的姓名。最重要的是分离成员资格和认证。

我们的模式是

Profiles 
-------- 
UserId 
FirstName 
LastName 
etc. 

Users 
----- 
Username 
Password 

Profiles.UserId简单来说就是存储任何用户内部用户名或OpenID的要求的URL,这取决于他们如何注册一个字符串属性。

成功验证后(使用内部用户名/密码或外部提供程序),我们只需使用其内部用户名或其声明网址来设置其身份验证Cookie。获取用户的配置文件然后就是找到配置文件的位置(UserId == User.Identity.Name)。

这样做的好处是用户可以选择在任何时候更改他们的身份验证方式(可能会切换到内部帐户或使用不同的提供商)。