Определить, требуется ли авторизация на текущей странице? - PullRequest
6 голосов
/ 02 августа 2010

Итак, у меня есть веб-приложения с 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 ]

7 голосов
/ 15 марта 2012

Вместо создания субъекта / удостоверения бутлега вы можете просто использовать общий идентификатор.

public bool IsAnonymousAccessAllowed()
{
   return UrlAuthorizationModule.CheckUrlAccessForPrincipal(Request.Path, new GenericPrincipal(new GenericIdentity(""), new string[0]), Request.RequestType);
}
4 голосов
/ 03 августа 2010

Создайте бутлег IPrincipal, а затем вы должны его использовать.Если у участника бутлега есть доступ, тогда разрешается анонимный доступ.

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
                    }
                }
            }
0 голосов
/ 17 февраля 2011

Более прямой подход заключается в следующем:

var method = typeof(UrlAuthorizationModule).GetMethod("RequestRequiresAuthorization", BindingFlags.NonPublic | BindingFlags.Static);
var requiresAuthentication = (Boolean)method.Invoke(null, new object[] { HttpContext.Current });

Перед использованием этого убедитесь, что на вашем веб-сайте есть разрешения для выполнения отражения.

Я никогда не понимал, почему Microsoft скрывает так много своего API, используя «внутренний» (как этот метод).По моему мнению, если Microsoft пришлось что-то раскрывать внутри, тогда, скорее всего, кто-то есть, где-то это тоже понадобится.

0 голосов
/ 02 августа 2010

сумасшедший!

HttpContext.Current.SkipAuthorization
0 голосов
/ 02 августа 2010

Я думаю, что если сервер возвращает ответ с 401 кодом неавторизованного статуса, для ресурса может потребоваться авторизация.Но иногда сервер может перенаправить на страницу входа, поэтому этот метод не очень надежен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...