5

アプリケーションを構築し、それを Active Directory と統合しています。

そのため、アプリ ユーザーを Active Directory ユーザーに対して認証し、その後、user group and user profile汎用プリンシパルとユーザー ID を汎用 ID に保存するなど、ユーザーのデータの一部を保存します。

私の問題は、ユーザー プロファイル データを使用したいときに、ジェネリック プリンシパルからユーザー プロファイル データを取得できないことです。

誰かがそれを行う方法を教えてもらえますか?

 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.

4

2 に答える 2

10

したがって、最初にこれを行うべきではありません:

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

コンストラクターの 2 番目の引数はRoles用です。ドキュメントを参照してください。


データを汎用プリンシパルに保存する場合は、次のことを行う必要があります。

  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;
     }
    
于 2013-04-24T05:03:43.217 に答える