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

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

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

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

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

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

有什么建议吗?

有帮助吗?

解决方案

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

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

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

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

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

其他提示

您可能缺少IIS设置。

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

点击“修改...”

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top