真的丢失了OpenID和ASP.NET MVC

时间:2010-04-02 13:21:30

标签: asp.net-mvc openid

我正在尝试使用ASP.NET MVC实现OpenID(是的,在我确定之前我们还没有听说过!)

但这确实不是大问题。我的一个大问题是,我非常困惑如何在需要存储大量有关登录用户信息的应用程序(配置文件,历史记录等)的同时执行此操作

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

我一直在阅读实现openId的NerdDinner 2.0应用程序代码,希望能回答我的问题 - 但是我发现没有这样的线索。

3 个答案:

答案 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中找到它。