自定义AuthorizationHandler中的ASP.NET Core 3.1 MVC重定向

时间:2020-04-24 13:50:19

标签: .net-core-3.1 asp.net-authorization

在ASP.NET Core 2 MVC应用程序中,我有一个自定义AuthorizationHandler,可将阻止的用户重定向回首页。

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsAllowedIpAddressRequirement requirement)
{
    // Cast the context resource
    if (context.Resource is AuthorizationFilterContext cxt)
    {
            // Failed!
            cxt.Result = new RedirectToActionResult("Index", "Home", new { msg = "Your auth has failed." });
            context.Succeed(requirement);
    }
    ...
}

自从迁移到ASP.NET Core 3.1以来,上下文是类Microsoft.AspNetCore.Routing.RouteEndpoint的对象,该类没有Result属性。

如何将用户重定向到特定页面?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,为了解决它,我改为使用过滤器 (IAsyncResourceFilter) 而不是策略。

您可以将您的授权逻辑包装到一个策略中,然后调用 IAuthorizationService 并在您需要的任何时间/任何时间进行重定向。

示例:

public class MySampleActionFilter: IActionFilter
{
   public void OnActionExecuting(ActionExecutingContext context)
   {
       //if failed
       context.Result = new RedirectToRouteResult(new RouteValueDictonary(new
       {
           controller = "Your Controller",
           action = "Your Action"
       }));
   }
}

顺便说一下,这是针对 .net Core 3 及更高版本

Documentation

答案 1 :(得分:0)

如果您要用户重定向到登录页面之类的页面,如果用户没有访问权限,则可以按照以下步骤进行修复:

  1. 进入HandleRequirementAsync方法

        if (Condition())
        {
            context.Succeed(requirement);
        }
        else {
            context.Fail();
        } 
    

如果用户确实有权访问,则执行context.Succeed(requirement);,如果用户没有访问权,则执行context.Fail();

  1. 进入startup.cs => ConfigureServices方法

    services.ConfigureApplicationCookie(options =>
    {
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromHours(12);
        options.LoginPath = "/Account/Login";
        options.AccessDeniedPath = "/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
    

我们写的那一行

 options.LoginPath = "/Account/Login";

我们未能通过HandleRequirementAsync方法来检查用户,该方法用于检查访问权限,并将其重定向到控制器“ home”控制器和“ login”活动。

我希望我的回答对朋友有用。