3

Есть ли способ переопределить атрибут AllowAnonymous? Я выполнил пользовательские разрешения, которое загружает пользовательское меню & кнопки из базы данных, как показано ниже:MVC переопределить атрибут AllowAnonymous

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new MyCustomAuthorization()); // Custom Authorization for Rights & Priveleges 
} 

выше работает отлично.

Теперь я хочу разрешить доступ к некоторому действию, если пользователь аутентифицирован, нет необходимости проверять авторизацию в этом случае. Пример:

[Authorize] 
public class MenusAndButtonsController : BaseController 
{ 
    [Authenticated] // my custom attribute that will check if user is logged in or not 
    public JsonResult GetGeneralMenuAndButtons() 
    { 
     using (MealPlannerAuthorizationEntities repository = new MealPlannerAuthorizationEntities()) 
     { 
      var MenusAndButtons = repository.MP_AUTH_Menus.Where(x => x.IsButton == false && x.IsListButton == false).Select(c => new { DisplayText = c.MenuName, Value = c.MenuId }).OrderBy(x => x.DisplayText).ToList(); 
      return Json(new { Result = "OK", Options = MenusAndButtons }, JsonRequestBehavior.AllowGet); 
     } 
    } 
} 

Вместо AllowAnonymous, я пытаюсь создать свой собственный пользовательский атрибут [Authenticated], который будет проверять, если пользователь вошел в систему или нет. Если пользователь вошел в систему, он вернет true, и GetGeneralMenuAndButtons продолжит свою работу.

ответ

5

Фактически AllowAnonymous класс - простой пустой закрытый класс атрибутов.

Так что, когда мы украшаем метод действия с AllowAnonymous атрибутом, то onAuthorization метод AuthorizeAttribute просто игнорирует авторизации и аутентификации проверки. Поэтому в моем случае мне также пришлось создать атрибут (пустой закрытый класс, наследуемый от класса атрибута) и немного изменить метод OnAuthorization.

Ниже приводится полная реализация:

public sealed class AuthenticateAttribute : Attribute 
{ 
    public AuthenticateAttribute() { } 
} 

Затем переопределить метод onAuthorization атрибута Authorize (конечно, я предполагаю, что у вас уже есть пользовательский фильтр авторизации реализован).

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    bool IsAuthenticAttribute = 
     (filterContext.ActionDescriptor.IsDefined(typeof(AuthenticateAttribute), true) || 
     filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AuthenticateAttribute), true)) && 
     filterContext.HttpContext.User.Identity.IsAuthenticated; 

    if (!IsAuthenticAttribute) 
    { 
     base.OnAuthorization(filterContext); 
    } 
} 

Наконец украсить ваш метод действия с нашим новым атрибутом Authenticate:

[Authenticate] 
public JsonResult GetParentMenus() 
{ 
    using (MealPlannerAuthorizationEntities repository = new MealPlannerAuthorizationEntities()) 
    { 
     var parentMenus = repository.MP_AUTH_Menus.Where(x => x.IsButton == false && x.IsListButton == false).Select(c => new { DisplayText = c.MenuName, Value = c.MenuId }).OrderBy(x => x.DisplayText).ToList(); 
     return Json(new { Result = "OK", Options = parentMenus }, JsonRequestBehavior.AllowGet); 
    } 
} 
Смежные вопросы