在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
属性。
如何将用户重定向到特定页面?
答案 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 及更高版本
答案 1 :(得分:0)
如果您要用户重定向到登录页面之类的页面,如果用户没有访问权限,则可以按照以下步骤进行修复:
进入HandleRequirementAsync
方法
if (Condition())
{
context.Succeed(requirement);
}
else {
context.Fail();
}
如果用户确实有权访问,则执行context.Succeed(requirement);
,如果用户没有访问权,则执行context.Fail();
进入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”活动。
我希望我的回答对朋友有用。