我正在尝试使用ASP.NET MVC实现OpenID(是的,在我确定之前我们还没有听说过!)
但这确实不是大问题。我的一个大问题是,我非常困惑如何在需要存储大量有关登录用户信息的应用程序(配置文件,历史记录等)的同时执行此操作
在我看来,OpenID取消了以网站为中心的逻辑,并使其开放。如果您只是将身份验证票证视为“经过验证的”用户,这一切都很好,但是严肃地说,我完全迷失了。是否可以实现OpenID,以便使用它登录将允许用户在我自己的应用程序上“存在”,就好像他们已经通过正常注册一样?
我一直在阅读实现openId的NerdDinner 2.0应用程序代码,希望能回答我的问题 - 但是我发现没有这样的线索。
答案 0 :(得分:1)
只需从OpenID获取数据并自动创建新注册。或者将具有空配置文件的用户重定向到包含配置文件表单的页面。
答案 1 :(得分:0)
执行此操作的典型方法是将OpenID与现有用户帐户相关联。我的案例中有一个关联表,因为用户可以拥有多个OpenID。
因此,如果我有一个帐户并且我使用https://openid.org/steven登录,那么它将映射到现有帐户。
答案 2 :(得分:0)
这里要了解的最重要的事情是OpenID提供程序不以任何方式控制用户会话。它仅为您提供与该用户关联的用户标识符。您也可以选择请求有关用户的一些数据。这意味着您不必管理除用户的OpenID标识符之外的任何用户数据。在大多数情况下,您希望将该标识符与数据库中的用户链接,但这并非绝对必要。
但你必须自己管理会话。当您使用OpenID登录时,您并不知道您实际已登录过。它只知道您一直在与提供商进行通信。这意味着应用了AuthorizeAttribute
的mvc操作仍然不会被触发。为此,你必须发布FormsAuthenticationTicket
,如此:
private void IssueFormsAuthenticationTicket(string identifier, bool rememberMe)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, //version
identifier, //name
DateTime.Now, //issue date
DateTime.Now.AddDays(14), //expiration date
rememberMe, //is presistant
identifier //user data
);
//Now we encrypt the ticket so no one can read it...
string encTicket = FormsAuthentication.Encrypt(ticket);
//...make a cookie and add it. ASP.NET will now know that our user is logged in.
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
}
这是这个的简单版本。然后,您可以使用User.Identity.Name
访问标识符数据。
如果您想在您的数据库中存储一些用户数据,您可以通过OpenID登录后面的注册表单进行操作,并将标识符链接到该帐户(您也可以选择支持将多个OpenID标识符链接到一个帐户) 。正如我所提到的,您也可以从提供商处请求一些数据并将其用于自动注册。但要小心,因为即使你说你必须拥有它,所有供应商并不总是提供所有服务。
例如,谷歌只为您提供标记为必需的数据。我只是忽略了你希望获得的所有数据请求,但是你实际上并没有。如果用户将其填入他或她的角色,MyOpenID将为您提供标记为必需或请求的所有数据。但如果用户的Persona没有您标记为必需的数据,登录甚至会成功。在我看来,在ASP.NET MVC中执行OpenID最好用DotNetOpenAuth完成。他们还有一个MVC样本,它是最简单的,但它的工作原理。该示例并未显示如何请求有关用户的数据,但您可以在NerdDinner中找到它。