Хранение информации DotNetOpenAuth и поиск информации о пользователе - PullRequest
17 голосов
/ 04 февраля 2010

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

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

Текущая таблица пользователей в БД имеет:

  • UserId (PK, uniqueidentifier) ​​
  • OpenIdIdentifier (nvarchar (255))
  • OpenIdDisplay (nvarchar (255))
  • Отображаемое имя (nvarchar (50))
  • Электронная почта (nvarchar (50))
  • PhoneNumber (nvarchar (50))

Поскольку UserId является явным идентификатором пользователя (они должны иметь возможность изменить своего провайдера OpenId позднее), это ключ, которыйдругие таблицы ссылаются на (для пользователя).

Это текущий код, который при успешной аутентификации создает временного пользователя и перенаправляет на Create Action.

        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. ЕслиЯ использую этот идентификатор пользователя в нескольких местах. Как мне извлечь его из файла cookie или сохранить в другом месте, более логичном / полезном?

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

1 Ответ

26 голосов
/ 04 февраля 2010

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...