2013-08-26 31 views
1

如何确定用户是否从互联网或内部网访问我的应用程序?干净的方式来识别来自内部网或互联网的用户

我很关心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 ...] 
+0

注意自己:如果使用IP方法,也允许本地调试请求,以及=>'HttpRequest.Current.Request.IsLocal | ' – user1778606

回答

1

首先,你不能使用Environment类获取有关向用户发送请求的信息。 Environment访问本地计算机的环境,因此您将始终获取服务器的详细信息。没有什么会告诉你有关客户的事情。

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

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

所以简单的答案是,如果不根据已知的内部网络范围检查IP地址,就无法做到这一点。

+0

很好的环境。它可能适用于非客户端服务器场景,但它几乎肯定会出于网络目的失败。 – user1778606

相关问题