Мой пользовательский атрибут авторизации всегда перенаправляет на страницу без авторизации - PullRequest
0 голосов
/ 17 октября 2018

Я пишу пользовательский атрибут авторизации для одного требования.

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

    [MyAuthorize("Admin,Reviewer")]
    public ActionResult GetFXSelldownSummaryData()
    {
        var model = (new FXSelldownSummaryBLL()).GetFXSelldownSummaryData();
        return View(model);
    }

Когдапользователь входит в систему, роль пользователя, вошедшего в систему, следует сравнивать со всеми разрешенными ролями (в приведенном выше коде все разрешенные роли - Admin и Reviewer).Если роль совпадает, пользователь может видеть представление, в противном случае страницу следует перейти к странице Авторизованный Un.

Я написал пользовательский атрибут, как показано ниже, все работает нормально, но я получаю неавторизованный доступСтраница для всех запросов.

Может кто-нибудь, пожалуйста, помогите определить и решить проблему!

namespace MyRequirement
{

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        readonly string allowedRoles;
        public MyAuthorizeAttribute(string allowedRoles)
        {
            this.allowedRoles = allowedRoles;
        }

        public System.Collections.Generic.List<string> AllowedRoles
        {
            get
            {
                return this.allowedRoles.Split(',').ToList();
            }
        }

        private bool AuthorizeRole(AuthorizationContext filterContext)
        {
            var context = filterContext.RequestContext.HttpContext;
            PnLUserDetails userDetails = System.Web.HttpContext.Current.Session["PnLUserDetails"] as PnLUserDetails;
            string loggedInUserRole = userDetails.Role;
            if (AllowedRoles.Contains(loggedInUserRole))
                return true;
            return false;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext == null)
                throw new ArgumentException("filterContext");
            bool authStatus = AuthorizeRole(filterContext);
            if(!authStatus)
            {
                filterContext.Result = new HttpUnauthorizedResult();
                return;
            }
        }
    }
}

1 Ответ

0 голосов
/ 17 октября 2018

Удалить вызов на

base.OnAuthorization(filterContext);

Изменить код следующим образом

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        // This line is not needed, you are handling the authorization
        // This is the line that will give you the unauthorized access by default
        // base.OnAuthorization(filterContext);
        if (filterContext == null)
            throw new ArgumentException("filterContext");
        bool authStatus = AuthorizeRole(filterContext);
        if(!authStatus)
        {
            filterContext.Result = new HttpUnauthorizedResult();
            return;
        }
    }
...