【问题标题】:Really lost with OpenID and ASP.NET MVCOpenID 和 ASP.NET MVC 真的迷路了
【发布时间】:2010-04-02 13:21:29
【问题描述】:

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

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

在我看来,OpenID 消除了以站点为中心的逻辑,并使其变得开放。如果您只是制作身份验证票以被视为“已验证”用户,这一切都很好 - 但说真的,我完全迷失了。是否有可能实现 OpenID,以便使用它登录将允许用户在我自己的应用程序中“存在”,就好像他们已经完成了正常注册一样?

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

【问题讨论】:

    标签: asp.net-mvc openid


    【解决方案1】:

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

    【讨论】:

    • 好的。那么最好的方法是在这个伪用户通过他们的开放 ID 登录时登录?
    • 这完全取决于您的应用程序以及您如何处理登录过程。我敢打赌,将 openId 数据存储在某处,并将用户拥有的所有其他内容链接到此表。您的普通用户将拥有一个不同的表,该表将链接到相同的数据。通过这种方式,您可以将一个配置文件链接到任意数量的登录提供商。
    • 如果您使用 OpenID 登录,则不需要密码,这就是重点。你当然可以让用户在之后创建一个带有密码的普通用户。
    【解决方案2】:

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

    因此,如果我有一个帐户并且我使用 https://openid.org/steven 登录,那么它会映射到现有帐户。

    【讨论】:

      【解决方案3】:

      这里要理解的最重要的一点是,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 标识符链接到单个帐户) .正如我所提到的,您还可以向提供商请求一些数据并将其用于自动注册。但要小心,因为即使你说你必须拥有它,所有供应商并不总是提供所有东西。

      例如,Google 仅向您提供标记为必需的数据。我只是忽略了所有你想要的数据请求,如果你能得到它,但你实际上并不一定有。如果用户将其填写到他或她的角色中,MyOpenID 将为您提供标记为必需或请求的所有数据。但是,如果用户的 Persona 没有您标记为必填的数据,即使登录也会成功。

      在我看来,在 ASP.NET MVC 中执行 OpenID 最好使用 DotNetOpenAuth。他们还有一个 MVC 示例,它是最简单的,但它可以工作。该示例没有显示如何请求有关用户的数据,但您可以在 NerdDinner 中找到。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 2015-04-06
        • 2018-03-07
        相关资源
        最近更新 更多