43

我有相同的网络应用程序在其他三台服务器上工作。任何人都知道为什么不在第四台服务器上工作?查看错误和堆栈跟踪:

发生操作错误。

说明:执行当前 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 上下文,类型 principalType,Nullable'1 identityType,字符串 identityValue,DateTime refDate)+14
System.DirectoryServices.AccountManagement。 Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue) +73
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue) +25
Infraero.TINE3.STTEnterprise.Web.Common.Seguranca.ServicoAutenticacao.EfetuarLogin(AcessoUsuario acessoUsuario, String senha) 在 D:\SVN\STT\trunk\4-0_CodigoFonte_Enterprise\4-4_SRC\Infraero.TINE3.STTEnterprise.Web\Common\ Segranca\ServicoAutenticacao.cs:34 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuarioAD(String matricula, String senha, AcessoUsuario acessoUsuario) 在 D:\SVN\STT\trunk\4-0_CodigoFonte_Enterprise\4-4_SRC\Infraero. TINE3.STTEnterprise.Web\Controllers\LoginController.cs:92 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuario(String matricula, String senha) 在 D:\SVN\STT\trunk\4-0_CodigoFonte_Enterprise\4-4_SRC \Infraero.TINE3.STTEnterprise.Web\Controllers\LoginController.cs:80 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController。D:\SVN\STT\trunk\4-0_CodigoFonte_Enterprise\4-4_SRC\Infraero.TINE3.STTEnterprise.Web\Controllers\LoginController.cs:54 lambda_method(Closure, ControllerBase, Object[]) 中的索引(LoginViewModel loginViewModel) +108
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器, Object[] 参数) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary'2 参数) +208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod( ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary'2 参数) +27
System.Web.Mvc.<>c__DisplayClass15.b__12() +55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func'1 延续) + 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) +10
System.Web.Mvc.<>c__DisplayClassb.b__5() +37
System.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() +62 System.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 结果) +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 中:

  • 选择您网站的应用程序池
  • 选择右侧的高级设置
  • 在 Advanced Settings 弹出窗口中,向下滚动到 Process Model 组
  • 将名为 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 错误。

几乎可以肯定这是因为您的应用程序池身份没有访问 Active Directory 的权限

于 2012-12-03T19:48:15.260 回答
6

在我的情况下,在应用程序池中从 ApplicationPoolItentity 切换到 NetworkService 确实有效,它不是首选“因为作为网络服务运行的服务可以篡改以相同身份运行的其他服务”,每个链接如下:(http://www. iis.net/learn/manage/configuring-security/application-pool-identities)。

我在服务器上运行了修补程序(KB2545850)并根据这个答案重新启动:(DirectoryServicesCOMException 80072020 From IIS 7.5 Site Running Under ApplicationPoolIdentity

它现在似乎运作良好。

我的任务背景:将应用程序从 Server 2003 上的 .net framework 2.0 升级到 Server 2008 R2 上的 .net framework 4.0。

于 2014-05-30T20:25:34.333 回答
3

我的经验与此错误略有不同。我不得不将本地应用程序移动到 Azure,LDAP 调用是从本地进行的,但即使在打开所需的防火墙之后也不能从 Azure 调用。

我尝试了上面提到的所有解决方案,但没有一个有帮助。Azure VM 上已选择网络服务。

经过大量的尝试和研究。我修好了它。

解决方案:本地服务器有权访问 LDAP,并且不需要任何用户名和密码。但在 Azure 上,您需要专门使用用户名和密码进行 LDAP 调用。下面是有帮助的代码。

 var directoryEntry= new DirectoryEntry(adspath, Username, Password)
于 2018-05-08T10:35:12.200 回答
2

1 - 更改应用程序池以在网络服务下运行。
2 - 单击身份验证并禁用 ASP.Net 模拟。

于 2017-08-15T14:14:30.003 回答
-1

因此,如果您在该行上放置一个断点:

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

并单步执行它,它会生成上面没有任何 InnerExceptions 的异常?

根据堆栈跟踪,该行是问题的开始。返回的异常应该至少包含一些其他信息,说明它被抛出的原因。

内部异常连接器

以下方法采用顶级异常并以字符串形式返回内部异常的制表符和换行符格式的细分。

    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 回答