Можете Вы включать [Авторизовать] для контроллера, но отключить его для единственного действия?

17
задан mipe34 8 February 2013 в 09:35
поделиться

2 ответа

Я не думаю, что можно сделать, это со стандартом Авторизовывает атрибут, но Вы могли получить свой собственный атрибут из AuthorizeAttribute, который берет список действий для разрешения и предоставляет доступ только к тем действиям. Можно посмотреть на источник для AuthorizeAttribute в www.codeplex.com для идей о том, как сделать это. Если бы Вы сделали, то это могло бы быть похожим:

[AdminAuthorize (Roles = "Administrator", Exempt = "Login, Logout") ]
public class AdminController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

    public ActionResult Login()
    {
        return View();
    }

    ... other, restricted actions ...
}

РЕДАКТИРОВАНИЕ : к вашему сведению я в конечном счете натыкался на потребность сделать что-то подобное самостоятельно, и я пошел другое направление. Я создал поставщика фильтра авторизации по умолчанию, и подайте заявку, глобальное авторизовывают фильтр. Поставщик фильтра авторизации использует отражение, чтобы проверить, имеют ли действие или контроллер определенное, авторизовывают примененный атрибут и, если так, подчиняется ему. Иначе это применяет фильтр авторизации по умолчанию. Это вместе с PublicAttribute, полученным из AuthorizeAttribute, который предоставляет открытый доступ. Теперь, я получаю защищенный доступ по умолчанию, но могу предоставить открытый доступ через [Public], относился к действию или контроллеру. Более определенная авторизация может также быть применена по мере необходимости. См. мой блог в http://farm-fresh-code.blogspot.com/2011/04/default-authorization-filter-provider.html

14
ответ дан 30 November 2019 в 11:04
поделиться

Вы могли переопределить метод OnAuthorization контроллера

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Login")
        {
            filterContext.Cancel = true;
            filterContext.Result = Login();
        }
    }

, Это работает, но это - взлом.

Полный код класса использовал для тестирования:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication2.Controllers
{
[HandleError]
[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Title"] = "Home Page";
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }


    public ActionResult About()
    {
        ViewData["Title"] = "About Page";

        return View();
    }


    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Index")
        {
            filterContext.Cancel = true;
            filterContext.Result = Index();
        }
    }
}
}
5
ответ дан 30 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

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