Ответ 1
1.Is response.ClaimedIdentifier - правильная часть информации, которая должна храниться у пользователя?
Да. И убедитесь, что столбец, который вы храните в базе данных, чувствителен к регистру. Вот схема таблицы, которая демонстрирует, как убедиться, что она чувствительна к регистру. Это происходит из схемы базы данных шаблона проекта DotNetOpenAuth. Бит "CS" указанной позиции сопоставления для Case Sensitive.
CREATE TABLE [dbo].[AuthenticationToken] (
[AuthenticationTokenId] INT IDENTITY (1, 1) NOT NULL,
[UserId] INT NOT NULL,
[OpenIdClaimedIdentifier] NVARCHAR (250) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL,
[OpenIdFriendlyIdentifier] NVARCHAR (250) NULL,
[CreatedOn] DATETIME NOT NULL,
[LastUsed] DATETIME NOT NULL,
[UsageCount] INT NOT NULL
);
2.Is FormAuthentication.SetAuthCookie - предпочтительный способ создания аутентификации? Или есть лучший способ?
Для приложений MVC это определенно, так как вы все еще можете вернуть свой предпочтительный ActionResult
из метода.
3. Когда я вызываю SetAuthCookie, нет данных, относящихся к пользователю, кроме Идентифицированного. Если я постоянно ссылаюсь на их UserId, лучше создать пользователя, а затем сохранить этот UserId в cookie вместо ClaimedIdentifier?
Это звучит как личное предпочтение. Но я обычно бываю с user_id, так как это может привести к более быстрому поиску базы данных каждый раз, когда приходит HTTP-запрос, который требует от вас поискать любую пользовательскую информацию.
4.Если я использую этот UserId в нескольких местах, как я могу извлечь его из файла cookie или сохранить его в другом месте более логичным/полезным?
FormsAuthentication предоставляет способ хранения большей информации в зашифрованном cookie, чем просто имя пользователя, но это сложнее, чем вы ожидали использовать. Этот фрагмент выходит из примера DotNetOpenAuth web SSO RP:
const int TimeoutInMinutes = 100; // TODO: look up the right value from the web.config file
var ticket = new FormsAuthenticationTicket(
2, // magic number used by FormsAuth
response.ClaimedIdentifier, // username
DateTime.Now,
DateTime.Now.AddMinutes(TimeoutInMinutes),
false, // "remember me"
"your extra data goes here");
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
Response.SetCookie(cookie);
Response.Redirect(Request.QueryString["ReturnUrl"] ?? FormsAuthentication.DefaultUrl);
Затем вы можете получить дополнительные данные в будущем HTTP-запросе:
var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null) {
var ticket = FormsAuthentication.Decrypt(cookie.Value);
if (!string.IsNullOrEmpty(ticket.UserData)) {
// do something cool with the extra data here
}
}