5

以下のコマンドを使用して文字列変数の役割を取得する方法はありますか....

 System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
  System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi);

私はこれが必要です

 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,                          // version
                                                   UserName.Text,           // user name
                                                   DateTime.Now,               // creation
                                                   DateTime.Now.AddMinutes(60),// Expiration
                                                   false,                      // Persistent 
                                                   role);         // User data

文字列として role= wp.IsInRole();
しかし、これは正しくありません

これに似た何か...

4

6 に答える 6

6

ユーザーが参加しているグループ/ロールのリストは、WindowsIdentity.Groupsプロパティから取得できます。WindowsIdentity.Groupsコレクションには、ユーザーが所属するグループ/ロールのSID(IdentityReferenceのコレクション)のみが含まれ、グループ/ロールの実際の名前は含まれません。ユーザーが所属するすべてのグループ/ロールの実際の名前を取得する方法を説明します。

まず、WindowsIdentityオブジェクトを取得します。

WindowsIdentity identity = WindowsIdentity.GetCurrent();

次に、LINQを使用してSID(IdentityReference)をNTAccountに変換します。

var groups = from sid in identity.Groups select sid.Translate(typeof(NTAccount)).Value;

次に、グループをループして、FormsAuthenticationTicketで使用できる文字列配列に格納できます。これにより、BUILTIN(ローカルコンピューター)グループ/ロールと、ユーザーが所属するDOMAINグループ/ロールの両方が取得されます。

于 2010-01-22T21:33:33.150 に答える
4

ロールを取得する場合: http://msdn.microsoft.com/en-us/library/system.web.security.roles.getrolesforuser.aspx

Roles.GetRolesForUser() orを使用Roles.GetRolesForUser(Page.User.Identity.Name)して、現在のユーザーが持つロールの配列を取得します。ロールを取得するユーザーを指定できますRoles.GetRolesForUser("Specific UserName")

String.Join(", ",Roles.GetRolesForUser())ユーザーが持つロールの文字列を取得するために使用できます。

String.Join http://msdn.microsoft.com/en-us/library/57a79xd0.aspx

お役に立てれば。

于 2011-07-21T18:08:52.557 に答える
2

あなたはリンゴとオレンジを混ぜているようです。WindowsまたはForms認証を使用していますか?

いずれの場合も、実装されている場合は、RoleProviderからユーザーのロールを取得できます。

スレッドの現在のプリンシパルを調べると、ご存知のようにIsInRoleのチェックメソッドのみが公開されますが、ロールプロバイダーはユーザーが属するロールの文字列配列を返します。

しかし、なぜあなたが役割をチケットに詰め込んでいるのかを尋ねなければなりませんか?これについて私が見ることができる唯一の有効なユースケースは、外部の認証/役割のサイロを統合していることです。

シナリオと要件をもう少し詳しく説明していただければ、問題に対する具体的な解決策を見つけることができると確信しています。

于 2010-02-10T04:11:57.537 に答える
1

そのようです?

public static string FormsAuthUserData
{
    get
    {
        IPrincipal principal = Thread.CurrentPrincipal;
        if (principal == null) return null;
        FormsIdentity identity = principal.Identity as FormsIdentity;
        if (identity == null) return null;
        FormsAuthenticationTicket ticket = identity.Ticket;
        return ticket == null ? null : ticket.UserData;
    }
}
于 2010-01-21T06:12:28.007 に答える
0

はい、フォーム認証は Windows ID と衝突するようですが、私はあなたが求めていることを実行すると信じているいくつかのコードを書きました。

まず、System.DirectoryServicesプロジェクトへの参照を追加します。

PrincipalContext最初にオブジェクトを初期化する必要があります。

imports System.DirectoryServices

Dim userImLookingFor as AccountManagement.UserPrincipal(ctx)
Dim tempUser As New AccountManagement.UserPrincipal(ctx)
tempUser.SamAccountName = p_samAccountName
Dim searcher As New AccountManagement.PrincipalSearcher(tempUser)
If searcher.FindAll().Count = 1 Then
userImLookingFor = searcher.FindAll()(0)

このコードを実行すると、userImLookingForp_samAccountName で指定されたユーザーが含まれます。次に、グループのリストを取得します。

Dim tempGp As New AccountManagement.GroupPrincipal(userImLookingFor.Context)
Dim searcher As New AccountManagement.PrincipalSearcher(tempGp)
Dim searchResult As AccountManagement.PrincipalSearchResult(Of AccountManagement.Principal)
searchResult = searcher.FindAll()

最後に、searchResult コレクションを参照できます。グループ名を取得するには、インデックスを列挙し、「ユーザー プリンシパル名」または「SAM アカウント名」のいずれかを取得します。

はい、フォーム認証は Active Directory ではうまく機能しませんが、これが役立つかどうか教えてください。前の回答のアプローチに慣れていません。これら 2 つの異なる答えにより、異なる機能にアクセスできるオブジェクトが得られる場合があります。

于 2010-02-11T15:21:09.997 に答える
0

ユーザー クラスに拡張メソッドを実行して、システム内のすべてのロールのコレクションを取得する (ロール プロバイダーに依頼する) ことができます。使用する。

これは、どのタイプの Role プロバイダーにも共通する方法です。

于 2010-02-22T21:13:05.780 に答える