Переопределение авторизовывает атрибут в ASP.NET MVC

Это зависит от вашего кода. Прежде всего, если вы работаете с рекурсивным методом, jvm сохраняет каждый объект в куче и содержит ссылку на каждый объект в стеке. Если вы хотите предотвратить эту ошибку, вы должны инициализировать неиспользуемый объект как ноль.

82
задан pb2q 30 March 2015 в 19:20
поделиться

3 ответа

Редактировать: Начиная с ASP.NET MVC 4 лучшим подходом является простое использование встроенного AllowAnonymous .

Ответ ниже относится к более ранним версиям ASP.NET MVC.

Вы можете создать пользовательский атрибут авторизации, наследуемый от стандартного AuthorizeAttribute с необязательным параметром bool, чтобы указать, требуется ли авторизация или нет.

public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
    private readonly bool _authorize;

    public OptionalAuthorizeAttribute()
    {
        _authorize = true;
    }

    public OptionalAuthorizeAttribute(bool authorize)
    {
        _authorize = authorize;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if(!_authorize)
            return true;

                    return base.AuthorizeCore(httpContext);
    }
}

] Затем вы можете украсить свой базовый контроллер этим атрибутом:

[OptionalAuthorize]
public class ControllerBase : Controller
{
}

, и для любых контроллеров, для которых вы не хотите авторизацию, просто используйте переопределение с «ложным» - например,

[OptionalAuthorize(false)]
public class TestController : ControllerBase
{
    public ActionResult Index()
    {
        return View();
    }
}
99
ответ дан Steve Willcock 24 November 2019 в 09:09
поделиться

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

Или вы можете иметь:

  • BaseController
    не требует аутентификации - здесь у вас есть все ваши «базовые вещи»:).

  • BaseAuthController: BaseController
    все действия здесь требуют аутентификации.

Таким образом, вы можете иметь аутентификацию, когда захотите, просто производным от определенного класса.

15
ответ дан splattne 24 November 2019 в 09:09
поделиться

If you just want one action to be unauthorized on an otherwise authorized controller you can do something like this:

public class RequiresAuthorizationAttribute : ActionFilterAttribute
{
    private readonly bool _authorize;

    public RequiresAuthorizationAttribute()
    {
        _authorize = true;
    }

    public RequiresAuthorizationAttribute(bool authorize)
    {
        _authorize = authorize;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var overridingAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof (RequiresAuthorizationAttribute), false);

        if (overridingAttributes.Length > 0 && overridingAttributes[0] as RequiresAuthorizationAttribute != null && !((RequiresAuthorizationAttribute)overridingAttributes[0])._authorize)
            return;

        if (_authorize)
        {
            //redirect if not authenticated
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                //use the current url for the redirect
                var redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;

                //send them off to the login page
                //var redirectUrl = string.Format("?RedirectUrl={0}", redirectOnSuccess);
                var loginUrl = LinkBuilder.BuildUrlFromExpression<HomeController>(filterContext.RequestContext, RouteTable.Routes,
                                                                                  x => x.Login(redirectOnSuccess));
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
        }
    }
}
6
ответ дан 24 November 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: