2016-05-13 1 views
2

私は、AD認証に大きく依存するASP.NETアプリケーションを持っています。私たちは最近、アプリケーションと同じソリューションで独自のソリューションに住んでいたサービスを突破しました。そのため、コードを変更する必要がある場合など、サービスに依存しているユーザーには影響しません。アプリケーションのUI側に影響を与えました。デバッグからのリモート呼び出しで失敗したADグループメンバーシップの取得

これは私にとっても面白い問題につながります。私がデバッグすると、アプリケーションのローカルコピーが、アプリケーションの環境コピーによっても使用されるサービスのリモートインスタンスを指しています。

System.Runtime.InteropServices.COMException(0x8007200A): 指定されたディレクトリサービス属性または値はありません - 私はローカルアプリ使用してユーザーのメンバーシップを認証しようとすると>リモートサービスコールを、それが次の例外で失敗します存在しない。

System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainerでSystem.DirectoryServices.DirectoryEntry.Bind System.DirectoryServices.DirectoryEntry.get_SchemaEntry()でSystem.DirectoryServices.DirectoryEntry.Bindで(ブール throwIfFail)()

System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntryを ctxBase、ブールownCtxBase、文字列名、文字列のパスワード、 ContextOptionsオプション)で(DirectoryEntryを デ) System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntryを エントリで) System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() System.DirectoryServices.AccountManagement.PrincipalContextでSystem.DirectoryServices.AccountManagement.PrincipalContext.Initialize() でSystem.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() で System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelperで.get_QueryCtx() (PrincipalContext コンテキスト、タイプprincipalType、Nullable`1たIdentityType、文字列 identityValue、日時refDate) System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentityで(PrincipalContext コンテキスト、String identityValue) *********************************。**** **************。IsUserMemberOfGroup(文字列ユーザ名、グループ名の文字列)

私がヒットするWebブラウザを使用して、同じグループ内で同じユーザーを認証しようとしたが、

リモートボックスにあるアプリをクリックすると、リモートサービスが表示されます。

私が使用しているコードは、やや単純です。私のマシンがどのように呼び出されているかとは関係がありますが、私がそれを試してみると、私は浸漬されます。

public static bool IsUserMemberOfGroup(string userName, string groupName) 
{ 
    try 
    { 
     PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "XXX"); 

     var user = GetUser(userName, ctx); 

     if (user == null) 
     { 
      Log4NetLogManager.LogError("Unable to find user " + userName); 
      return false; 
     } 

     // find the group in question 
     groupName = groupName.Replace("XXX\\", string.Empty); 
     GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName); 

     if (group != null) return user.IsMemberOf(group); 

     Log4NetLogManager.LogError("Unable to find group " + groupName); 
     return false; 
    } 
    catch (Exception ex) 
    { 
     if (!ex.Message.Contains("Unknown error")) 
     { 
      Log4NetLogManager.LogException(string.Format("Error while checking if {0} is a member of {1}", userName, groupName), ex); 
     } 
     return false; 
    } 
} 

private static UserPrincipal GetUser(string userName, PrincipalContext ctx) 
{ 
    UserPrincipal user = null; 
    userName = userName.Replace("XXX\\", string.Empty); 

    try 
    { 
     user = UserPrincipal.FindByIdentity(ctx, userName); 
    } 
    catch 
    { 
    } 

    return user ?? UserPrincipal.FindByIdentity(ctx, userName); 
} 
+0

両方の環境で.configファイルを確認しましたか?違いは? – JCM

+0

はい - 環境特有の違いのみです(つまり、電子メールの件名、ターゲット、ロギング場所など)。 – Marisa

+0

これをチェックしましたか:http://stackoverflow.com/questions/29647024/the-specified-directory-service-attribute-or-value-does-not-exist? – JCM

答えて

0

ドメイン名を削除するのは早すぎるため、別の2番目のチャンスを実際には試みていません。実際に

private static UserPrincipal GetUser(string userName, PrincipalContext ctx) 
{ 
    UserPrincipal user = null; 

    try 
    { 
     user = UserPrincipal.FindByIdentity(ctx, userName); 
    } 
    catch (Exception exc1) 
    { 
     Log4NetLogManager.LogError("First chance: " + exc1.Message); 
    } 
    userName = userName.Replace("XXX\\", string.Empty); 

    return user ?? UserPrincipal.FindByIdentity(ctx, userName); 
} 

私はのStackTrace内DoDomainInitは(ローカルマシンが異なるドメインに存在する可能性やアイデンティティの文字列パラメータは、リモートボックス上で異なる動作をする可能性のいずれか)があることに気付きました。マシンがドメインに属していない場合は、user/pswdを指定する必要があります。エラーがこのissueに似ているとして、それは、ネットワークサービスの下で実行するには、ローカルマシンApplication Pool Identityを変更することで、それを固定することができた場合

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "XXX", "ad_usr","ad_pswd"); 
var user = GetUser(userName, ctx); 

も確認してください。

関連する問題