1. Является ли response.ClaimedIdentifier правильной частью информации, которая будет сохранена против пользователя?
Да .И убедитесь, что столбец, в котором вы храните его в базе данных, чувствителен к регистру.Вот схема таблицы, которая демонстрирует, как убедиться, что она чувствительна к регистру.Это происходит из схемы базы данных шаблона проекта DotNetOpenAuth.Бит "CS" указанного сопоставления обозначает регистр с учетом регистра.
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. Является ли FormAuthentication.SetAuthCookie предпочтительным способом проверки подлинности форм?Или есть лучший способ?
Для приложений MVC это определенно так, поскольку вы все еще можете вернуть предпочитаемый ActionResult
из метода.
3. Когда явызовите SetAuthCookie, нет никаких данных, касающихся пользователя, за исключением ClaimedIdentifier.Если я последовательно ссылаюсь на их UserId, то лучше создать пользователя, а затем сохранить этот UserId в cookie вместо ClaimedIdentifier?
Это звучит как личное предпочтение.Но я бы обычно использовал user_id, так как это может привести к более быстрому поиску в базе данных каждый раз, когда приходит HTTP-запрос, требующий от вас поиска любой пользовательской информации.
4.Если я использую этот идентификатор пользователя в нескольких местах, как мне извлечь его из файла cookie или сохранить в другом месте, более логичном / полезном?
FormsAuthentication предоставляет способ хранить больше информации в своем зашифрованном cookie, чем просто имя пользователя, но это сложнее, чем вы ожидаете использовать.Этот фрагмент взят из примера веб-SSO RP DotNetOpenAuth:
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
}
}