ASP.NET MVC 2 проблема авторизации - PullRequest
3 голосов
/ 07 января 2011

Я использую пользовательский провайдер членства.Все работает отлично.Однако в моем файле web.config я включил «запретить пользователям», поэтому весь сайт заблокирован.

Это прекрасно работает.Пользователь перенаправлен на страницу входа.

Теперь у меня есть несколько контроллеров / действий, которые я хочу разрешить анонимный доступ.О странице, сбросе пароля и т. Д.

Единственный способ выяснить, как это сделать, - разблокировать весь сайт, поставить атрибуты [Authorize] на каждом контроллере и удалить их для нужного контроллера / действийАноним.

Мне кажется, это задом наперед.Я предпочитаю заблокировать все по умолчанию и разблокировать то, что является анонимным.

Есть ли способ обойти это?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 января 2011

Я могу придумать альтернативные способы реализации этого, но все они включают использование настраиваемого атрибута AuthorizeAttribute. Один из способов сделать это - использовать базовый контроллер с использованием указанного настраиваемого атрибута AuthorizeAttribute, от которого происходят все ваши контроллеры. Этот атрибут должен быть настроен для предотвращения анонимного (и неавторизованного) доступа к действию, если только его контроллер или само действие не были украшены другим атрибутом - скажем, AnonymousEnabledAttribute. Все ваши контроллеры наследуются от этого контроллера и, таким образом, наследуют его стандартное поведение «по умолчанию нет». Затем вы просто декорируете контроллеры / действия, которые вы хотите анонимно, с помощью AnonymousEnabledAttribute - предоставляя переопределение для этого контроллера или действия. Или для контроллера просто не наследуйте от защищенного контроллера, и все его действия становятся общедоступными.

О, и весь ваш сайт должен оставаться открытым.

[OverridableAuthorize]
public abstract class ProtectedController : Controller
{
}

public class MostlyProtectedController : ProtectedController
{
    public ActionResult ProtectedAction()
    {
    }

    [AnonymousEnabled]
    public ActionResult PublicAction()
    {
    }
}

[AnonymousEnabled]
public class ExplicitlyPublicController : ProtectedController
{
    // inherits additional behaviors, but anonymous is enabled by attribute
}

public class PublicByOmissionController : Controller
{
    // doesn't inherit and is thus public -- assuming whole site is open
}

public class AnonymousEnabledAttribute : Attribute
{
}

public class OverridableAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization( AuthorizationContext context )
    {
          context.HttpContext.Items["ActionDescriptor"] = context.ActionDescriptor;
          base.OnAuthorize( context );
    }

    public override bool AuthorizeCore( HttpContextBase context )
    {
         var actionDescriptor = context.Items["ActionDescriptor"] as ActionDescriptor;
         if (actionDescriptor == null)
         {
             throw InvalidOperationException( "ActionDescriptor missing from context" );
         }
         var attribute = actionDescriptor
                             .GetCustomAttributes( typeof(AnonymousEnabledAttribute,true)
                             .FirstOrDefault();
         if (attribute == null)
         {
             return base.AuthorizeCore( context );
         }
         return true;
    }
}
1 голос
/ 07 января 2011

Вы можете создать местоположение в вашем файле web.config для контроллеров, которые вы всегда хотите разрешить:

<configuration>
    <system.web>
        ...
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>
    ...
    <location path="MyArea/MyController">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>
    ...
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...