Этим вопросом является определенный структурный вопрос / вопрос о дизайне, поскольку я испытываю затруднения при разработке лучшего способа выполнить задачу.
В моем приложении MVC я использую DotNetOpenAuth (3.4) в качестве моего поставщика данных для входа и просто использую стандарт FormsAuthentication
для cookie и т.д.
Текущая пользовательская таблица в DB имеет:
Поскольку UserId является ясным идентификатором для пользователя (они должны быть в состоянии изменить своего поставщика OpenId позднее), это - ключ, который другие таблицы связывают с (для пользователя).
Это - текущий код, который на успешной аутентификации, создает временного пользователя и перенаправляет к Действию по созданию.
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
var users = new UserRepository();
if (!users.IsOpenIdAssociated(response.ClaimedIdentifier))
{
var newUser = new DueDate.Models.User();
newUser.OpenIdIdentifer = response.ClaimedIdentifier;
newUser.OpenIdDisplay = response.FriendlyIdentifierForDisplay;
TempData["newUser"] = newUser;
return this.RedirectToAction("Create");
}
И теперь для затруднения вопроса:
response.ClaimedIdentifier
корректная информация для хранения против пользователя?
FormAuthentication.SetAuthCookie
предпочтительный путь к аутентификации форм? Или есть ли лучший путь?
Когда я называю SetAuthCookie, нет никаких данных, касающихся пользователя за исключением ClaimedIdentifier
. Если я последовательно обращаюсь к их UserId
, лучшая идея состоит в том, чтобы создать пользователя, затем сохранить это UserId
в cookie вместо ClaimedIdentifier
?
Если я использую тот UserId во многих местах, как я или получаю его от cookie или храню его где-то в другом месте более логический/полезный?
Немного долго обветренный, но я испытывал затруднения при попытке разработать лучший способ сделать этот /
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. Если я использую этот UserId в нескольких местах, как мне получить его из файла 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
}
}