这里要理解的最重要的一点是,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 中找到。