【发布时间】: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="data source=MyServer;initial catalog=MyDB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" 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