ASP.NET IAuthorizationFilter при авторизации

#c# #asp.net-mvc-3 #authorization

#c# #asp.net-mvc-3 #авторизация

Вопрос:

Привет, я пытаюсь реализовать пользовательский фильтр авторизации

  //The Authourization attribute on a controller
public class CustomAdminAuthorizationFilter : IAuthorizationFilter
{
    private readonly IAuthentication _authentication;

    public SageAdminAuthorizationFilter(IAuthentication authentication)
    {
        _authentication = authentication;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
       bool result = _authentication.Authorize(filterContext.HttpContext);
    }
}
  

Как вы можете видеть при авторизации, я получаю результат, который является истинным или ложным.
Что мне нужно установить, чтобы вернуться туда, откуда я пришел?

Редактировать:

Кажется, что это все еще перебрасывает меня прямо на страницу входа в систему

Я действительно внедряю IAuthetication

  this.BindFilter<CustomAdminAuthorizationFilter>(FilterScope.Controller, 0);
   Bind<IAuthentication>().To<CustomAuthenticationService>();
  

Затем я оформляю свое действие в контроллере следующим образом.

 [Authorize]
    public ActionResult Index()
    {
        ViewBag.Title = "Welcome";
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }
  

В моем web.config я использую

 <authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
  

Следует ли это изменить?

Любая помощь была бы высоко оценена.

Ответ №1:

Измените это на Attribute , а не просто на IAuthorizationFilter

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class SageAdminAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    readonly IAuthentication _authentication;

    public SageAdminAuthorizeAttribute(IAuthentication authentication)
    {
        _authentication = authentication;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!_authentication.Authorize(filterContext.HttpContext))
            filterContext.Result = new HttpUnauthorizedResult();
    }
}
  

И теперь вместо использования [Authorize] используйте свой новый [SageAdminAuthorize] атрибут

 [SageAdminAuthorize]
public ActionResult Index()
{
    ViewBag.Title = "Welcome";
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    return View();
}
  

Комментарии:

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

2. Я использовал приведенный выше пример для создания нового атрибута под названием ‘Permission’. Я хотел использовать авторизацию на основе разрешений вместо ролей. Это правильный способ? Или я должен использовать какой-то другой способ проверки прав пользователя?

3. Определенно, это хороший способ. Вы можете определить, как выполняется авторизация в вашем OnAuthorization методе любым выбранным вами способом.

4. Базовый интерфейс IAuthorizationFilter является избыточным, поскольку AuthorizeAttribute он уже реализован.

5. Кроме того, атрибут AttributeUsageAttribute является избыточным, поскольку он унаследован от своего родителя. При авторизации также следует использовать ключевое слово override. Базовый класс реализует интерфейс, вы просто изменяете его поведение.