所以,我有像web.configs这样的网络应用程序:
<authorization>
<deny users="?"/>
</authorization>
...
<location path="SomeUnsecuredPage.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
换句话说,大多数页面都需要身份验证和授权,但有些页面不需要。
然后我有一个IHttpModule,将被所有不同的应用程序使用。我想要做的就是检查当前的请求是否“完全”。如果页面不需要授权,我不希望我的IHttpModule做任何事情。我正在使用FormsAuthentication,我认为FormsAuthentication已经将所有这些信息缓存到某个地方,不是吗?此外,由于此检查将持续运行,因此必须非常快。
我目前正在订阅HttpApplication.AuthorizeRequest,但令人惊讶的是,即使对于允许匿名访问的资源,此事件也会触发。
有什么想法吗?谢谢你的阅读!
答案 0 :(得分:7)
您可以使用通用标识,而不是创建盗版主体/标识。
public bool IsAnonymousAccessAllowed()
{
return UrlAuthorizationModule.CheckUrlAccessForPrincipal(Request.Path, new GenericPrincipal(new GenericIdentity(""), new string[0]), Request.RequestType);
}
答案 1 :(得分:4)
创建一个盗版IPrincipal然后你必须使用它。如果bootleg主体具有访问权限,则允许匿名访问。
public static class AnonymousAccessCheck
{
public static bool IsAnonymousAccessAllowed(HttpRequest request)
{
// unfortunately checking if a page allows anonymous access is more complicated than you'd think(I think).
// here we have to create a "Fake" IPrincipal that will only ever have access to
// pages that allow anonymous access. That way if our fake principal has access,
// then anonymous access is allowed
UrlAuthorizationModule urlAuthorizationModule = new UrlAuthorizationModule();
return UrlAuthorizationModule.CheckUrlAccessForPrincipal(request.Path, AnonymousPrincipal.Instance, request.RequestType);
}
private class AnonymousPrincipal : IPrincipal
{
private static AnonymousPrincipal _Instance;
public static AnonymousPrincipal Instance
{
get
{
if (_Instance == null)
_Instance = new AnonymousPrincipal();
return _Instance;
}
}
private AnonymousPrincipal()
{
_Identity = new AnonymousIdentity();
}
private readonly IIdentity _Identity;
#region IPrincipal Members
public IIdentity Identity
{
get { return _Identity; }
}
public bool IsInRole(string role)
{
return false;
}
#endregion
private class AnonymousIdentity : IIdentity
{
#region IIdentity Members
public string AuthenticationType
{
get { return string.Empty; }
}
public bool IsAuthenticated
{
get { return false; }
}
public string Name
{
get { return string.Empty; }
}
#endregion
}
}
}
答案 2 :(得分:0)
我认为如果服务器使用401 Unauthorized状态代码返回响应,则资源可能需要授权。但有时服务器可能会重定向到登录页面,因此这种方法不太可靠。
答案 3 :(得分:0)
DERP!
HttpContext.Current.SkipAuthorization
答案 4 :(得分:0)
更直接的方法如下:
var method = typeof(UrlAuthorizationModule).GetMethod("RequestRequiresAuthorization", BindingFlags.NonPublic | BindingFlags.Static);
var requiresAuthentication = (Boolean)method.Invoke(null, new object[] { HttpContext.Current });
在使用此功能之前,请确保您的网站具有执行反射的权限。
&LT;咆哮&GT;
我从未理解为什么微软会使用&#34;内部&#34;隐藏他们的API。 (像这种方法)。在我看来,如果微软必须在内部暴露某些东西,那么很可能是某个人,某些地方也需要它。
&LT; /咆哮&GT;