这里要理解的最重要的事情是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中找到该数据。
好的。那么最好的方法是通过他们的开放ID登录这个伪用户吗? – Ciel 2010-04-02 13:30:48
这是如何与密码等工作? – Ciel 2010-04-02 13:33:04
完全取决于您的应用程序以及您如何处理登录过程。我敢打赌,将openId数据存储在某个地方,并将用户拥有的其他所有内容链接到此表。您的普通用户将拥有不同的表格,这些表格将链接到相同的数据。这样,您可以将一个配置文件链接到任意数量的登录提供程序。 – 2010-04-02 13:35:05