Настраиваемый атрибут авторизации (продолжение) - PullRequest
4 голосов
/ 22 февраля 2011

Хорошо, продолжаем с этой темой , вот что я придумал ...

public class SharweAuthorizeAttribute : AuthorizeAttribute
{
    private bool isAuthenticated = false;
    private bool isAuthorized = false;
    public new string[] Roles { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == true)
        {
            isAuthenticated = true;
            foreach (string role in Roles)
            {
                if (RolesService.HasRole((string)role))
                    isAuthorized = true;
            }
        }
        return (isAuthenticated && isAuthorized);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!isAuthenticated)
        {
            filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary 
                            {
                                { "action", "User" },
                                { "controller", "Login" }
                            });
        } else if(!isAuthorized) {
            filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary 
                            {
                                { "action", "Home" },
                                { "controller", "Error" }
                            });
        }
    }
}

Как / почему я это придумал? Потому что я считаю, что рабочий процесс AuthorizeAttribute выглядит следующим образом:

  1. Во-первых, AuthorizeCore срабатывает. Если он возвращает true, пользователь авторизован. Если он возвращает false, запускается HandleUnauthorizedRequest. Это верно?
  2. Я где-то читал, что мне нужно использовать ключевое слово new для переопределения свойства. Таким образом, я переопределил свойство Roles. Но что, если переопределяющее свойство было другого типа, чем исходное свойство (свойство базового класса), это также скрывает его или создает совершенно другое свойство?

Так что ты думаешь? Должно ли это на самом деле работать? Я не могу проверить это сейчас, потому что я не настроил пользовательский интерфейс (ожидая, когда дизайнер покончит с дизайном) ... Фактически, это первый раз, когда я ценю преимущества TDD, я привык думать, что это совершенно глупо и бесполезно, но я ошибся :)

P.S .: В этой теме , @tvanfosson устанавливает CachePolicy для контекста (я думаю), может кто-нибудь объяснить это и почему, возможно, мне нужно это сделать, пожалуйста?

Заранее спасибо.

1 Ответ

2 голосов
/ 16 ноября 2012
public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        private readonly bool _authorize;
        private readonly string[] _roles;
        public CustomAuthorizeAttribute(string roles)
        {
            _authorize = true;
            _roles = roles.Split(',');
        }

        public CustomAuthorizeAttribute(string roles, bool isAdminPath)
        {
            _authorize = true;
            _roles = roles.Split(',');
        }



        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {


            //if controller have role auth and user is not loged
            if(_authorize && !httpContext.User.Identity.IsAuthenticated)
            {
                return false;
            }

            // if controller have role auth and user is loged
            if(_roles != null)
            {

                //grab user roles from DB
                var UserRole = RoleRepository.GetUserRole(new Guid(httpContext.User.Identity.Name));
                if (_roles.Contains(UserRole))
               {
                   return true;
               }

            }

            return false;

        }
    }

В контроллере

    [CustomAuthorize("Administrator,Company,OtherRole")]
    public ActionResult Test(){

    return View();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...