2010-08-02 3 views
3

Я внедрил собственный пользовательский MemberhipProvider с пользовательским хранилищем данных. На данный момент проблем нет. Я бы хотел, чтобы люди входили в систему, используя свой адрес электронной почты вместо имени пользователя. Поскольку у меня есть собственное хранилище данных, это не является серьезной проблемой, я могу просто передать электронное письмо как имя пользователя для MembershipProvider.Сохранение дополнительных пользовательских данных в MemberhipProvider/FormsAuthenticationTicket

Вопрос в том, как хранить дополнительные пользовательские данные в FormsAuthenticationTicket? Я хочу сохранить пару вещей, которые никогда не изменятся, например, их UserId, First/Last Name и Country. Я начал изучать создание FormsAuthenticationTicket с UserData, но быстро запутался. Как хранить несколько вещей в этой UserData, и как я могу легко читать эти данные на каждой странице ASP.NET MVC2. Я нашел много образцов, ни один из которых не казался таким большим с точки зрения MVC2. Должен быть простой способ сделать это.

Нет смысла читать UserId, First/Last Name и страну из базы данных по каждому запросу, потому что она никогда не изменится. Кроме того, хотя я хочу, чтобы пользователь входил в систему, используя свой адрес электронной почты, я хотел бы сохранить их UserId в файле cookie auth, чтобы его можно было использовать почти для каждого пользовательского запроса к базе данных, а не по электронной почте (потому что во всех таблицах пользовательские данные сохраняются вместе с UserId - а не по электронной почте, потому что технически электронная почта может быть изменена - я уже понял, что это происходит, когда дело доходит до MembershipProvider).

Каковы наилучшие методы хранения дополнительных пользовательских данных, подобных этому в ASP.NET MVC2?

ответ

1

Просто храните его отдельно самостоятельно. Все формы auth - это хранить его в файле cookie и шифровать/расшифровывать на сервере. Вы можете сами зашифровать/дешифровать данные. Вы также можете использовать другие магазины, такие как дисковый ввод-вывод или кеш, поэтому вы не храните ничего на клиенте.

HTH.

+0

Я хотел бы сохранить эти несколько вещей на клиенте, если это возможно, потому что это веб-приложение будет размещено на многих серверах, и пользователи не гарантированно снова окажутся на том же сервере. Я понимаю, что я могу хранить это в своем собственном (зашифрованном) куки-файле, но понял, что может быть больше смысла помещать его в файл cookie? Таким образом, мне не нужно управлять двумя файлами cookie. Кроме того, я хотел бы прочитать значения, используя User.Identity.something или что-то подобное просто. – Stefan

+0

Что происходит, когда один из ваших пользователей выходит замуж? –

+0

Данные, которые я хочу добавить в файл cookie, не будут меняться во время сеанса. Первое/последнее имя может быть изменено в базе данных (где данные загружаются с одного раза при входе пользователя в систему). Он будет правильно заполняться в следующий раз, когда пользователь войдет в систему. Такое поведение ожидается. – Stefan

1

Как насчет использования сеанса для этого?

+1

Я забыл упомянуть, что это веб-приложение должно быть очень масштабируемым для использования с сотнями тысяч пользователей. Поскольку приложение будет работать на многих серверах (не в привязке), я пытаюсь избежать использования переменных Session. – Stefan

0

Я хотел бы использовать профиль для хранения пользовательской информации пользователя, он, в конце концов, что он был разработан для :)

ASP.Net Profile

И если вам нужно хранить информацию в более структурированном формате SQL , используйте Custom Profile Provider

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

+0

В идеале я хотел бы избежать необходимости запрашивать базу данных по каждому запросу, чтобы получить базовую информацию, такую ​​как UserId, Name и Country. Эти несколько вещей должны быть сохранены на клиенте (например, в зашифрованном файле cookie). Это будет гораздо более масштабируемым. – Stefan

+0

Единственная фиксированная часть данных есть userId. Я думаю, вам нужно оценить баланс между масштабируемостью и управляемостью. Люди и их информация очень преходящи. Что произойдет, если вы хотите изменить информацию, установленную в будущем? –

+0

Информация может быть изменена, но не будет обновляться в файле cookie auth до следующего входа. – Stefan

2

Файл cookie FormsAuthenticationTicket имеет свойство UserData, в котором вы можете хранить все, что захотите. Я бросаю сериализованные графы объектов JSON там для кэширования связанных с пользователем материалов, таких как Last, First names или дополнительная информация о роли.

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

0

Профиль - это лучший способ хранения пользовательских конкретных данных. Все, что вам нужно сделать, это создать поля на странице web.config, а затем ссылаться на них так же, как переменная состояния сеанса. Состояние сеанса полезно для данных, которые сохраняются в течение 1 сеанса (отсюда и название).

Веб.Config:

<profile> 
     <properties> 
      <add name="DepartmentNumber"/> 
     </properties> 
    </profile> 

Сохранить в профиль:

ProfileCommon newProf = Profile.GetProfile(username); 
       newProf.DepartmentNumber = "12"; //Or whatever string data you have. 
       newProf.Save(); 

Ссылка:

String departmentNumber = Profile.DepartmentNumber; //Data is stored as String. 
0

Если обеспокоены туда-обратно запросов каждый раз, когда вы нужны эти данные, а затем сделать комбинацию сессии Состояние и профиль. Храните данные в профиле, а затем, после того как ваш логин завершится успешно, возьмите эти значения в состояние сеанса. Используйте их из состояния сеанса во время этого сеанса. Вы даже можете добавить проверку, которая будет запрашивать профиль, если состояние сеанса пуст.

4

Это сообщение показывает (помимо всего прочего) информацию о хранении в FormsAuthenticationTicket.UserData и считывает его с базового контроллера. http://www.west-wind.com/weblog/posts/899303.aspx

Как кто-то предложил выше, простой в использовании класс данных, содержащий всю необходимую информацию и пару методов сериализации/десериализации.

public class UserState 
    { 
     public int Id { get; set; } 

     public Guid ActivationId { get; set; } 
     public string UserName { get; set; } 
     public string Email { get; set; } 
     public bool IsAdmin { get; set; } 

     // Serialize  
     public override string ToString() 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string result = serializer.Serialize(this); 
      return result; 
     } 

     // Deserialize 
     public static UserState FromString(string text) 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      return serializer.Deserialize<UserState>(text); 
     } 
    } 
} 
Смежные вопросы