确定当前页面是否需要授权?

时间:2010-08-02 18:36:47

标签: asp.net forms-authentication

所以,我有像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,但令人惊讶的是,即使对于允许匿名访问的资源,此事件也会触发。

有什么想法吗?谢谢你的阅读!

5 个答案:

答案 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;