如何从aspx代码中的泛型主体中获取自定义数据?

时间:2013-04-24 04:10:48

标签: c# .net asp.net-4.5

我正在构建一个应用程序并将其与活动目录集成。

所以我将我的app用户验证为活动目录用户,然后我将一些用户的数据存储到Generic主体,将用户身份存储到Generic identity中。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 个答案:

答案 0 :(得分:8)

首先,你不应该这样做:

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

构造函数的第二个参数是角色。请参阅docs


如果您想将数据存储到通用主体中,那么您应该做的是

  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属性。

    例如,在Page load中你可以这样做:

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

答案 1 :(得分:2)

您还可以使用以下代码:

FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
string userData = id.Ticket.UserData