Подтвердить что ты не робот

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

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

В моем приложении 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");
                }

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

  • Является ли response.ClaimedIdentifier правильная часть информации для хранения против пользователя?

  • Является ли FormAuthentication.SetAuthCookie предпочтительным способом создания аутентификации? Или есть лучший способ?

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

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

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

4b9b3361

Ответ 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
    }
}