Здесь важно понять, что поставщик OpenID никак не контролирует сессию пользователей. Он только дает вам идентификатор пользователя, который связан с этим пользователем. При желании вы также можете запросить некоторые данные о пользователе. Это означает, что вам не нужно управлять какими-либо пользовательскими данными, кроме идентификатора OpenID пользователя. В большинстве случаев вы хотите связать этот идентификатор с пользователем в вашей базе данных, но это не является строго обязательным.
Но вы должны управлять сессией самостоятельно. Когда вы входите в систему с помощью OpenID, вы не можете понять, что вы на самом деле вошли в систему. Все, что он знает, это то, что вы общались с провайдером. Это означает, что действия mvc, к которым применен AuthorizeAttribute
, все равно не будут запущены. Для этого вам нужно выдать 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 пользователя нет данных, которые вы пометили как необходимые.
Делать OpenID в ASP.NET MVC, на мой взгляд, лучше всего с DotNetOpenAuth. У них также есть образец для MVC, который является самым простым, но он работает. В этом примере не показано, как запрашивать данные о пользователе, но вы можете найти это в NerdDinner.