Как показать Отказано в доступе вместо перенаправления на страницу входа? - PullRequest
0 голосов
/ 06 марта 2020

Я использую ASP. NET Identity 2 в ASP. NET MVC 5 приложении с OWIN. На данный момент, если аутентифицированный пользователь пытается получить доступ к действию, для которого у него нет роли, он перенаправляется на страницу входа. Как сделать так, чтобы аутентифицированные пользователи получали страницу AccessDenied в этом случае, но неаутентифицированные пользователи по-прежнему отправляются на страницу входа?

Метод ConfigureAuth следующим образом:

public void ConfigureAuth(IAppBuilder app)
{
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider
        {
        }
    });
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    app.UseSaml2Authentication(GetSamlOptions());
}

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Попробуйте этот пользовательский атрибут авторизации, он не перенаправляет, а заменяет содержимое, поэтому URL-адрес остается неизменным, а также поддерживает ajax запрос:

    public class AppAuthorizeAttribute : AuthorizeAttribute
    {

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var isAuthorized = base.AuthorizeCore(httpContext);
            if (!isAuthorized)
            {
                return false;
            }
            // do another checks here...
        }

        // This will be executed when AuthorizeCore returns false
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    var urlHelper = new UrlHelper(filterContext.RequestContext);
                    filterContext.HttpContext.Response.StatusCode = 403;
                    filterContext.Result = new JsonResult
                    {
                        Data = new
                        {
                            ErrorMessage = "Unauthorized"
                        },
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet
                    };
                }
                else
                {
                    filterContext.Result = new ViewResult
                    {
                        ViewName = "~/Views/Error/AccessDenied.cshtml"
                    };
                }
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }

    }

Замените все [Authorize] вашим пользовательским атрибутом. [AppAuthorize]

0 голосов
/ 06 марта 2020

Я реализовал пользовательский атрибут авторизации следующим образом:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (filterContext.Result is HttpUnauthorizedResult)
        {
            var route_values = new RouteValueDictionary
            {
                ["controller"] = "Account"
            };
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                route_values["action"] = "AccessDenied";
            }
            else
            {
                route_values["action"] = "Login";
                route_values["returnUrl"] = filterContext.HttpContext.Request.Url.PathAndQuery;
            }
            filterContext.Result = new RedirectToRouteResult(route_values);
        }
    }
}

Я все еще открыт для любого ответа, который использует некоторое значение конфигурации OWIN.

Спасибо всем, кто помог.

0 голосов
/ 06 марта 2020

Вы можете использовать пользовательские [DataAnnotations] на основе ролей для предоставления доступа определенным пользователям. Что-то вроде:


[OnlyAllowedAttribute("Roles=Admin")]
public IActionResult OnlyAuthenticatedUsers()
{
  return View();
}

public class OnlyAllowedAttribute: AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated)
        {
          if(filterContext.Result is HttpUnauthorizedResult)
          {
              filterContext.Result = new RedirectResult("~/Account/AcessDenied");
          }
        }
        else
        {
          filterContext.Result = new RedirectResult("~/Account/Login");
        }
    }
}

{ ссылка }

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