Как получить пользовательские данные из общего принципала внутри кода aspx?

Я создаю приложение и интегрирую его с активным каталогом.

Таким образом, я аутентифицирую своего пользователя приложения для пользователей активного каталога, после чего я сохраняю некоторые данные пользователя, такие как: user group and user profile к основному принципу и идентификатору пользователя к универсальному идентификатору.

Моя проблема в том, что я не могу получить данные профиля пользователя из общего принципала, когда я хочу их использовать.

Может кто-нибудь показать мне, как это сделать?

 string cookieName = FormsAuthentication.FormsCookieName;
 HttpCookie authCookie = Context.Request.Cookies[cookieName];

 if (authCookie == null)
 {
       //There is no authentication cookie.
       return;
 }

 FormsAuthenticationTicket authTicket = null;

 try
 {
       authTicket = FormsAuthentication.Decrypt(authCookie.Value);
 }
 catch (Exception ex)
 {
      //Write the exception to the Event Log.
       return;
 }

 if (authTicket == null)
 {
      //Cookie failed to decrypt.
      return;
 }

 String data = authTicket.UserData.Substring(0, authTicket.UserData.Length -1);
 string[] userProfileData =   data.Split(new char[] { '|' });
 //Create an Identity.
 GenericIdentity id = 
                  new GenericIdentity(authTicket.Name, "LdapAuthentication");
 //This principal flows throughout the request.
 GenericPrincipal principal = new GenericPrincipal(id, userProfileData);
 Context.User = principal;

Примечание. Код выше находится в глобальном файле asax, и я хочу использовать данные профиля пользователя, которые я сохранил в общем файле в другом файле с именем default.aspx,

2 ответа

Решение

Итак, во-первых, вы не должны делать это:

GenericPrincipal principal = new GenericPrincipal(id, userProfileData);
                                                     //^^ this is wrong!!

Второй аргумент конструктора - для ролей. Смотрите документы.


Если вы хотите сохранить данные в общий принципал, то вам следует сделать следующее:

  1. Создать класс из GenericIdentity:

    class MyCustomIdentity : GenericIdentity
    {
      public string[] UserData { get; set;}
      public MyCustomIdentity(string a, string b) : base(a,b)
      {
      }
    }
    
  2. Создайте это так:

    MyCustomIdentity = 
               new MyCustomIdentity(authTicket.Name,"LdapAuthentication");
                                                      //fill the roles correctly.
    GenericPrincipal principal = new GenericPrincipal(id, new string[] {});
    
  3. Получите это на странице как это:

    Класс Page имеет свойство User.

    Так, например, при загрузке страницы вы можете сделать это:

     protected void Page_Load(object sender, EventArgs e) {
      MyCustomIdentity id =  (MyCustomIdentity)this.User.Identity
      var iWantUserData = id.UserData;
     }
    

Вы также можете использовать следующий код:

FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
string userData = id.Ticket.UserData
Другие вопросы по тегам