ASP.NET验证故障排除

时间:2009-09-09 22:54:50

标签: c# asp.net iis-7 webserver

我有一个相当复杂的网络应用程序(由承包商)构建使用集成身份验证。作为身份验证过程的一部分,使用GetNetworkID()函数,如下所示:

private string GetNetworkID()
{
    return HttpContext.Current.User.Identity.Name.Split(new char[] { '\\' })[1];
}

当我在开发框中运行它时,HttpContext.Current.User.Identity.Name值为。{1} myNetwork \\ myUserID ,因此上述功能按预期返回我的用户ID,并且验证过程正常。

但是当我在我的网络服务器上运行时,我得到一个索引超出了GetNetworkID()函数中return语句抛出的数组错误的范围。

我对如何解决这个问题以及如何判断它是否是IIS配置问题(我的Web服务器是运行IIS 7的Windows Server 2008框)或其他方面感到有点迷失。

如果我将用户ID硬编码为GetNetworkID()函数的返回值,它可以在Web服务器上运行,但我对如何在Web服务器上调试以确定没有任何好主意HttpContext.Current.User.Identity.Name返回值是什么导致数组索引错误。

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

IIS作为IIS服务帐户运行,因此Current.User.Identity可能是IIS帐户的名称。

为了完整起见,您应该使用Find()或通过调用split来检查'\',并检查结果数组的长度。如果长度为1,则表示id不是域\用户名。

通常,如果要进行调试,可以将任何值写入HTTP Response流,如下所示:

Response.Write(HttpContext.Current.User.Identity.Name)

另一种方法是设置ASP页面变量,并将页面变量设置为您要检查的值。您可以通过ASP代码或通过Javascript显示变量值。

答案 1 :(得分:2)

您可能缺少IIS设置。

尝试在IIS中: 网站(右键单击)|属性|目录安全性(选项卡)

点击“修改...”

然后选择“集成Windows身份验证”

答案 2 :(得分:1)

我认为登录到其他服务器上的Web应用程序的用户不是有效登录。因此,User.Identity.Name上不会返回结果。

就像你说的那样,当你硬编码用户名时它会起作用。 这意味着,您网站上不允许使用您用于登录的PC的用户信用。因此,这必须与您正在硬编码的凭据不同。

最好的办法是在Web服务器上进行调试(这并不难 - 您想要返回的只是User.Identity.Name,您可以从中获取用户名和推导逻辑),并验证您网络中的内容.config文件。

答案 3 :(得分:1)

正如艾伦指出的那样(我赞成他)你可能想要检查User.Identity.Name采取什么形式。例如,更新的例程可能如下所示:

private string GetNetworkID()
{
    var name = HttpContext.Current.User.Identity.Name;
    return name.InStr("\\") > -1 ? name.Split("\\")[1] : name;
}

如果存在\,则返回登录名的第二部分,如果不存在则返回完整字符串。