Храня информацию DotNetOpenAuth и извлечение информации о пользователе

Этим вопросом является определенный структурный вопрос / вопрос о дизайне, поскольку я испытываю затруднения при разработке лучшего способа выполнить задачу.

В моем приложении MVC я использую DotNetOpenAuth (3.4) в качестве моего поставщика данных для входа и просто использую стандарт FormsAuthentication для cookie и т.д.

Текущая пользовательская таблица в DB имеет:

  • UserId (PK, uniqueidentifier)
  • OpenIdIdentifier (nvarchar (255))
  • OpenIdDisplay (nvarchar (255))
  • Displayname (nvarchar (50))
  • Электронная почта (nvarchar (50))
  • PhoneNumber (nvarchar (50))

Поскольку 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");
                }

И теперь для затруднения вопроса:

  1. response.ClaimedIdentifier корректная информация для хранения против пользователя?

  2. FormAuthentication.SetAuthCookie предпочтительный путь к аутентификации форм? Или есть ли лучший путь?

  3. Когда я называю SetAuthCookie, нет никаких данных, касающихся пользователя за исключением ClaimedIdentifier. Если я последовательно обращаюсь к их UserId, лучшая идея состоит в том, чтобы создать пользователя, затем сохранить это UserId в cookie вместо ClaimedIdentifier?

  4. Если я использую тот UserId во многих местах, как я или получаю его от cookie или храню его где-то в другом месте более логический/полезный?

Немного долго обветренный, но я испытывал затруднения при попытке разработать лучший способ сделать этот /

17
задан Alastair Pitts 4 February 2010 в 02:27
поделиться

1 ответ

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
    }
}
26
ответ дан 30 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: