我有一个相当复杂的网络应用程序(由承包商)构建使用集成身份验证。作为身份验证过程的一部分,使用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
返回值是什么导致数组索引错误。
有什么建议吗?
答案 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;
}
如果存在\
,则返回登录名的第二部分,如果不存在则返回完整字符串。