43

同じWebアプリが他の3つのサーバーで動作しています。なぜ4番目のサーバーで動作しないのか誰かが知っていますか?エラーとスタックトレースを参照してください。

操作エラーが発生しました。

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとエラーがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。

例外の詳細:
System.DirectoryServices.DirectoryServicesCOMException:操作エラーが発生しました。

ソースエラー:

現在のWebリクエストの実行中に、未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

スタックトレース:

[DirectoryServicesCOMException(0x80072020):操作エラーが発生しました。] System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)+454 System.DirectoryServices.DirectoryEntry.Bind()+36 System.DirectoryServices.DirectoryEntry.get_AdsObject()+31 System.DirectoryServices.PropertyValueCollection.PopulateList()+22
System.DirectoryServices .PropertyValueCollection..ctor(DirectoryEntry entry、String propertyName)+96
System.DirectoryServices.PropertyCollection.get_Item(String propertyName)+142 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()+1134 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()+37 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +124 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()+31 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context、Type primaryType、Nullable'1 IdentityType、String IdentityValue、DateTime refDate)+
14System.DirectoryServices.AccountManagement。 Principal.FindByIdentityWithType(PrincipalContextコンテキスト、タイプprincipalType、文字列identityValue)+73
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context、String IdentityValue)+25
Infraero.TINE3.STTEnterprise.Web.Common.Seguranca.ServicoAutenticacao.EfetuarLogin(AcessoUsuario acessoUsuario、String senha)in D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise Seguranca \ ServicoAutenticacao.cs:34 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuarioAD(String matricula、String senha、AcessoUsuario acessoUsuario)in D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SR TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:92 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuario(String matricula、String senha)in D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:80Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController。D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infrastructure.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:54 lambda_method(Closure、ControllerBase、Object [])+108のIndex(LoginViewModel loginViewModel)
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller、Object [] parameters)+17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary'2 parameters)+208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod( ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary'2 parameters)
+27System.Web.Mvc。<>c__DisplayClass15.b__12()+55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func'1 continuation)+ 263
System.Web.Mvc。<>c__DisplayClass17.b__14()+19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext、IList'1フィルター、ActionDescriptor actionDescriptor、IDictionary`2パラメーター)+191
System.Web.Mvc.ControllerActionInvoker .InvokeAction(ControllerContext controllerContext、String actionName)+343
System.Web.Mvc.Controller.ExecuteCore()+116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)+97 System.Web.Mvc.ControllerBase.System.Web .Mvc.IController.Execute(RequestContext requestContext)+
10System.Web.Mvc
。<>c__DisplayClassb.b__5()+37System.Web.Mvc.Async。<>c__DisplayClass1.b__0()+21
System.Web.Mvc.Async。<>c__DisplayClass8'1.b__7(IAsyncResult _)+12 System.Web.Mvc.Async.WrappedAsyncResult'1.End()+62System.Web.Mvc。<>c__DisplayClasse.b__d( )+50
System.Web.Mvc.SecurityUtil.b__0(アクションf)+7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(アクションアクション)+22 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+60
システム。 Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8963149 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&完了同期)+184

EfetuarLoginメソッド:

public static bool EfetuarLogin(User user, string password)
{
    bool isValid = false;

    if (user != null)
    {
        PrincipalContext context = new PrincipalContext(ContextType.Domain);

        using (context)
        {
            isValid = context.ValidateCredentials(user.Login, password);

            if (isValid)
            {
                UserPrincipal userAD = UserPrincipal.FindByIdentity(context, user.Login);

                MySession.CurrentUser = new MyUserSession()
                {
                    Id = user.Id,
                    ProfileId = user.ProfileId ,
                    Login = user.Login ,
                    Name = userAD.Name
                };
            }
        }
    }

    return isValid;
}
4

7 に答える 7

69

まったく同じエラーが発生し、ネットワークサービスで実行するようにサイトのアプリケーションプールを変更することで修正しました。

IISの場合:

  • サイトのアプリケーションプールを選択します
  • 右側の[詳細設定]を選択します
  • [詳細設定]ポップアップウィンドウで、[プロセスモデル]グループまで下にスクロールします
  • Identityと呼ばれる最初のオプションをNetworkServiceに変更します(私のものはデフォルトのApplicationPoolIdentityに設定されていました)。

これがお役に立てば幸いです。

于 2013-02-21T11:43:13.680 に答える
35

このトピックが古いことは知っていますが、この問題を探している将来の人々のためだけです このメソッドを使用して、昇格権限でコードを実行してください

using (HostingEnvironment.Impersonate()) {
    // This code runs as the application pool user
    }
于 2013-05-23T15:06:53.953 に答える
8

この場合はありませんInnerException。COM エラーをラップしているだけです。

ほとんどの場合、アプリケーション プール ID に Active Directory へのアクセス許可がないことが原因です。

于 2012-12-03T19:48:15.260 に答える
3

私の経験は、このエラーで少し異なりました。オンプレミス アプリケーションを Azure に移動する必要がありました。この場合、LDAP 呼び出しはオンプレミスから発生していましたが、必要なファイアウォールを開いた後でも Azure からではありませんでした。

上記の解決策をすべて試しましたが、どれも役に立ちませんでした。ネットワーク サービスは、Azure VM で既に選択されています。

多くのヒットと試行錯誤の後。それを私が直した。

解決策: オンプレミス サーバーには LDAP へのアクセス権限があり、ユーザー名とパスワードは必要ありませんでした。ただし、Azure では、ユーザー名とパスワードを使用して LDAP 呼び出しを具体的に行う必要があります。以下は助けたコードです。

 var directoryEntry= new DirectoryEntry(adspath, Username, Password)
于 2018-05-08T10:35:12.200 に答える
-1

したがって、行にブレークポイントを配置すると、次のようになります。

UserPrincipal userAD = UserPrincipal.FindByIdentity(context, user.Login);

それをステップ実行すると、InnerExceptions を持たない上記の例外が生成されますか?

スタック トレースによると、その行が問題の始まりです。返された例外には、それがスローされた理由に関する他の情報が少なくとも含まれている必要があります。

InnerException 連結子

次のメソッドは、最上位の例外を受け取り、内部例外のタブと改行形式の内訳を文字列として返します。

    private static string InnerExceptionConcatenator(Exception ex, int tabTracker = 0)
    {
        string retVal = "";
        if (ex.InnerException != null)
        {
            tabTracker ++;
            retVal = string.Format( "{0}\r\n{1}{2}", ex.Message, new String('\t', tabTracker), InnerExceptionConcatenator(ex.InnerException));
        }
        else
        {
            retVal = ex.Message;
        }
        return retVal;
    }

次のように呼び出すことができます。

try
{

}
catch(ex Exception)
{
    var exceptionString = InnerExceptionConcatenator(ex);
    var path = @"c:\temp\exception.txt";
    if (!File.Exists(path)) 
    {
        using (StreamWriter sw = File.CreateText(path)) 
        {
            sw.WriteLine(exceptionString);
        }   
    }
    else
    {
        using (StreamWriter sw = File.AppendText(path)) 
        {
            sw.WriteLine(exceptionString);
        }
    }
}
于 2012-12-03T19:17:57.540 に答える