如何确定用户是否从互联网或内部网访问我的应用程序?
我对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 :(得分:1)
首先,您无法使用Environment
类来获取有关向您的服务器发出请求的用户的信息。 Environment
访问本地计算机的环境,因此您将始终获取服务器的详细信息。没有什么可以告诉你关于客户的事情。
服务器可用的所有客户端信息都位于Request
对象中。如果您在网站上使用身份验证,则可以让用户登录,然后在System.Web.HttpContext.Current.Request.LogonUserIdentity
中查看用户的安全详细信息。
但是,这仍然无法告诉您客户实际上在哪里。测试用户的登录域只会告诉您用户是否已对域进行身份验证,而不是客户端是否在本地网络上。如果您的网站可以从网络外部访问(例如使用NAT,或服务器上的混合公共+私有地址),您仍然必须检查请求中的IP地址,以确保它位于本地网络中。
因此,简短的回答是,如果不根据已知的内部网络范围检查IP地址,则无法执行此操作。