1

如何确定用户是从 Internet 还是 Intranet 访问我的应用程序?

我对 IIS 服务器变量的来源和安全性感到非常困惑。 http://msdn.microsoft.com/en-us/library/ms524602.aspx 例如,远程用户的 Request.ServerVariables["AUTH_USER"] 是否为空?

此外,http: //msdn.microsoft.com/en-us/library/system.environment.userdomainname.aspx上有关 Environment.UserDomainName 的文档 让我认为可以通过将计算机名称命名为域来进行游戏我正在检查的名字

理想情况下,我只想...

if ( [ ... user is not remote ... ] && Enironment.UserDomainName == "TargetLocalDomainName" )
    var username = Environment.UserName;
    PrepareLocalUserSession(username);
    RedirectToHomePage();
 } 
 //else
 [... redirect to remote login page ...]

所以我的问题是如何确定用户是否来自远程目的地?如果可能的话,我强烈希望使用比 IP 检查更简单的东西。

谢谢


编辑

我认为我上面的方法太可怕了,我想发布一个理智的方法

var hostAddress = System.Web.HttpContext.Current.Request.UserHostAddress;

bool localUser = hostAddress.StartsWith("192.") | hostAddress.StartsWith("10.") | hostAddress.StartsWith("172.") || HttpRequest.Current.Request.IsLocal;

string username = Request.ServerVariables["LOGON_USER"].split( new char[]{"/"})[0]; 
string domain   = Request.ServerVariables["LOGON_USER"].split( new char[]{"/"})[1];

if( localUser && domain == "TargetLocalDomainName" ){
   PrepareLocalUserSession(username);
   RedirectToHomePage();
} 

//else
[... redirect to remote login page ...]
4

1 回答 1

2

首先,您不能使用Environment该类来获取有关向您的服务器发出请求的用户的信息。 Environment访问本地计算机的环境,因此您将始终获得服务器的详细信息。里面没有任何东西会告诉你关于客户的一件事。

服务器可用的所有客户端信息都将在Request对象中。如果您在网站上使用身份验证,您可以让用户登录,然后检查用户的安全详细信息System.Web.HttpContext.Current.Request.LogonUserIdentity

但是,这仍然不会告诉您客户实际在哪里。测试用户的登录域只会告诉您用户是否已针对该域进行身份验证,而不是客户端是否在您的本地网络上。如果您的网站可以从您的网络外部访问(例如使用 NAT,或服务器上的混合公共 + 私有地址),您仍然需要检查请求中的 IP 地址以确保它在本地网络中。

所以简短的回答是,如果不根据已知的内部网络范围检查 IP 地址,您将无法执行此操作。

于 2013-08-26T02:55:46.387 回答