2010-04-02 59 views
1

我试图实现与ASP.NET MVC的OpenID(是的,我们还没有听说过,我敢肯定!一个前)真的失去了与OpenID和ASP.NET MVC

那真的是不但是,最大的问题在于。我的巨大问题是,我非常困惑如何做到这一点,同时需要存储大量关于登录用户的信息(配置文件,历史记录等)

在我看来,OpenID带走了以网站为中心的逻辑,并使其开放。如果您只是将身份验证凭证视为“已验证”的用户,那么这一切都很好,但非常严肃,我完全失败了。是否可以实现OpenID,使用它登录将允许用户在我自己的应用程序上“存在”,就好像他们已经通过正常注册一样?

我一直在阅读实现openId的NerdDinner 2.0应用程序代码,希望能回答我的问题 - 但可惜我找不到这样的线索。

回答

1

只需从OpenID获取数据并自动创建一个新的注册。或者将具有空白配置文件的用户重定向到具有配置文件表单的页面。

+0

好的。那么最好的方法是通过他们的开放ID登录这个伪用户吗? – Ciel 2010-04-02 13:30:48

+0

这是如何与密码等工作? – Ciel 2010-04-02 13:33:04

+0

完全取决于您的应用程序以及您如何处理登录过程。我敢打赌,将openId数据存储在某个地方,并将用户拥有的其他所有内容链接到此表。您的普通用户将拥有不同的表格,这些表格将链接到相同的数据。这样,您可以将一个配置文件链接到任意数量的登录提供程序。 – 2010-04-02 13:35:05

0

执行此操作的典型方法是将OpenID与现有用户帐户相关联。我的例子中有一个关联表,因为用户可以有多个OpenID。

所以,如果我有一个帐户,我登录https://openid.org/steven然后将其映射到现有的帐户。

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)); 
} 

这是这个simples版本。然后您可以使用User.Identity.Name访问标识符数据。

如果您想要将某些用户数据存储在您的数据库中,您可以通过注册表单执行此操作,该表单遵循OpenID登录并将标识符链接到该帐户(您也可以选择支持将多个OpenID标识符链接到单个帐户)。正如我所提到的,您还可以向提供者请求一些数据并将其用于自动注册。但要小心,因为即使你说你必须拥有它,所有提供者并不总是提供一切。

Google仅举例说明了您需要标记的数据。我只是忽略了所有你希望得到的数据请求,但你实际上并不需要。如果用户将其填入自己的角色,MyOpenID将为您提供所有需要或要求标记的数据。但是,如果用户的角色没有标记为必需的数据,则登录甚至会成功。

在我看来,在ASP.NET MVC中做OpenID是最好的DotNetOpenAuth。他们也有MVC的样本,这是最简单的,但它的工作原理。该示例虽然不显示如何请求关于用户的数据,但您可以在NerdDinner中找到该数据。