我想在web.config中使用以下内容保护目录中的文件 - 但我也想做一个例外,这样一个特定的IP就可以在不登录的情况下访问内容。
<configuration>
<system.web>
<authorization>
<allow roles="Role 1" />
<allow roles="Role 2" />
<deny users="*" />
</authorization>
</system.web>
怎么办呢?
1 个答案:
答案 0 :(得分:2)
没有内置的方法可以允许,但我认为你应该能够编写一个快速模块,提供“IP身份验证”,这将允许你除了其他身份验证模块之外,还有任何提供身份的模块工作。
例如,这是一个快速示例:
公共类IPAuthenticationModule:IHttpModule {
private IPAddress [] ipAddresses = {};
public void Dispose(){
}
public void Init(HttpApplication context){
string s = ConfigurationManager.AppSettings [“ipAddresses”];
if(!string.IsNullOrWhiteSpace(s)){
this.ipAddresses = s.Split(',')。选择((ip)=&gt; IPAddress.Parse(ip.Trim()))。ToArray();
}
context.AuthenticateRequest + = OnContextAuthenticateRequest;
}
private void OnContextAuthenticateRequest(object sender,EventArgs e){
HttpApplication app =(HttpApplication)sender;
HttpContext context = app.Context;
if(context.User == null){
string clientIP = context.Request.UserHostAddress;
IPAddress clientIPAddress = IPAddress.Parse(clientIP);
if(this.ipAddresses.Contains(clientIPAddress)){
context.User = new GenericPrincipal(
新的GenericIdentity(clientIP,“Basic”),
new string [] {“IPAddressRole”});
}
}
}
}
然后在你的web.config中配置模块以及允许的ipAddresses,例如:
&LT;&的appSettings GT;
&lt; add key =“ipAddresses”value =“127.0.0.1,:: 1”/&gt;
&LT; /&的appSettings GT;
&LT; system.webServer&GT;
&LT;模块&gt;
&lt; add name =“IPAuthenticationModule”type =“IPAuthenticationModule,YourDLLName”/&gt;
&LT; /模块&gt;
&LT;安全&GT;
&LT;授权&GT;
&lt; add accessType =“Deny”users =“?” /&GT;
&LT; /授权&GT;
&LT; /安全&GT;
&LT; /system.webServer>
这将允许访问127.0.0.1,并在标识中注入“IPAddressRole”角色,因此您甚至可以提供上述访问权限,并根据代表IP的角色限制/允许不同的访问级别。它还将使用用户名作为IP地址,因此在日志中您将看到所有内容。