【问题标题】:Unable to run MVC web application locally无法在本地运行 MVC Web 应用程序
【发布时间】:2014-02-17 11:33:58
【问题描述】:

我被要求对现有的 MVC 网站进行更改,不幸的是,该网站的原始开发人员已不在公司,没有任何文档,除了当前运行之外,没有人真正了解它我们的测试和现场环境。 呻吟

无论如何,当我将项目设置为启动项目并运行它时,我会得到以下可爱的白色错误页面:

Access is denied.

Description: An error occurred while accessing the resources required to serve this request. The server may not be configured for access to the requested URL.

Error message 401.2.: Unauthorized: Logon failed due to server configuration. Verify that you have permission to view this directory or page based on the credentials you supplied and the authentication methods enabled on the Web server. Contact the Web server's administrator for additional assistance.

对我来说不是很多(至少对我来说)。 所以我检查了 web.config 文件,authorization 设置为:

<authorization>
   <deny users=”?” />
</authorization>

如果我将其更改为下面的代码,我会得到一个页面说它无法加载,但这是更进一步的,因为我至少可以稍微了解一下代码。

    <authorization>
      <allow users="*"/>
    </authorization>

该代码确实对Active Directory 进行了一些验证,这是可行的,我可以通过设置断点并跳过该功能来绕过那个讨厌的安全代码。代码本身不做任何事情,如果用户有效则返回true(我将断点移至此),如果用户无效则返回false。这是我能够在控制器中捕获断点以查看是否发生任何事情的唯一方法,但没有任何问题。 该代码可能是部分代码,它位于一个将使用LINQ 获取正确信息的类中。

public ReadOnlyCollection<Application> GetApplicationStatus()
{
    using (ApplicationDBEntities context = new ApplicationDBEntities())
    {

            var results = (from parameters in context.Parameters
                 join application in context.ApplicationIds on parameters.ApplicationId equals application.ApplicationId1
                 where parameters.ParameterName.Equals("DateTime", StringComparison.OrdinalIgnoreCase) &&
                 !parameters.Application.Equals(0)
            select new Application
            {
                ApplicationId = parameters.ServiceId,
                ApplicationStatus = application.Status,
                DateAdded = parameters.ParameterValue
                }).ToList();

            return new ReadOnlyCollection<Application>(results);
    }
}

在上面的代码中,它会在获取results 时抛出一个EntityException,异常中的消息是“底层提供程序在打开时失败”。突出显示的特定行是var results = (from parameters in context.Parameters

有了这个,我发现要么当前的代码与我所拥有的不一样(希望不是这种情况),要么出现了其他问题,这就是我发现Inner Exception 消息的时候:Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON'.
连接字符串如下:

<connectionStrings>
    <add name="ApplicationDBEntities" connectionString="metadata=res://*/ApplicationDBModel.csdl|res://*/ApplicationDBModel.ssdl|res://*/ApplicationDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyServer;initial catalog=MyDB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

它试图从中获取信息的SQL database 是我可以直接访问的。这可能是IIS 帐户没有访问权限之类的吗?是否有任何提示或提示可以尝试找到此问题的根本原因?

【问题讨论】:

  • 你能给我们一些关于你的开发和生产环境的细节吗?是否在两个环境中都部署到 IIS?
  • 在现场它被部署到 IIS,在本地我已经从项目的 Properties / Web 选项卡创建了一个虚拟目录,以将它添加到我的本地 IIS
  • 是否使用 ActiveDirectory 用户访问 sql 数据库(即为站点的每个用户创建域用户并将其添加到 sql)?
  • 没有,据我所知,代码只是将您所在的 AD 组与 web.config 中的授权组进行比较。

标签: sql-server asp.net-mvc linq


【解决方案1】:

在您的连接字符串中有集成的 security = true,这意味着您的站点尝试从 sql 获取数据,并以运行 IIS 应用程序池的用户身份进行身份验证。

因此,您应该由对数据库拥有权限的用户运行您的 iis 应用程序池,并且可能对您网站的其他资源拥有权限。

另一种可能是有 sql 用户去数据库,你应该在配置文件中更改连接字符串。

【讨论】:

  • 那么把 DefaultAppPool 改成在我自己的登录下运行?
  • 好吧,但它并不理想,因为这意味着我在该应用程序池中的所有其他应用程序现在都在我的凭据下运行。有我可以使用的标准帐户吗?以前它设置为 NetworkService。或者是否会更新 SQL 以设置该设置?
  • 如果我是你,我会为这个应用程序创建特殊的应用程序池。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 2017-04-09
  • 1970-01-01
  • 2020-09-17
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多