【问题标题】:ASP.NET Core 2.0 Redirecting user from AuthorizationHandler, HandleRequirementAsync methodASP.NET Core 2.0 从 AuthorizationHandler、HandleRequirementAsync 方法重定向用户
【发布时间】:2018-02-15 18:38:34
【问题描述】:

我正在尝试在 .net core 2.0 中实现 AuthorizationHandler ,我需要授权用户并根据想要重定向到我的应用程序验证中的不同操作方法的条件工作正常,但我如何将用户重定向到拒绝访问或授权失败时的登录页面。

 protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasPermissionRequirement requirement)
    {
        var controllerContext = context.Resource as AuthorizationFilterContext;

        if (sessionManager.Session.sysUserID <= 0)
        {
            controllerContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "Login", area = "" }));

            return Task.FromResult(0);
        }


            if (Utilities.GetInt32Negative(PermissionID) == 1 || Utilities.GetInt32Negative(PermissionID) == -1)
            {
                if (!PagePath.Equals("~/"))
                    controllerContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "NoAccess", area = "" }));
            }

            context.Succeed(requirement);
        }
        else
        {
            if (!PagePath.Equals("~/"))
                controllerContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "NoAccess", area = "" }));
        }

        return Task.FromResult(0);
    }

【问题讨论】:

  • 您不应该根据授权要求进行重定向。设置您的身份验证处理程序以在授权失败时重定向到正确的页面。这通常在Startup 中完成,您可以在其中定义您支持的身份验证方法等。

标签: asp.net-core asp.net-core-2.0 .net-core-2.0


【解决方案1】:

我找到了解决方案,我希望这对寻找类似解决方案的人有所帮助,在自定义授权中,我们可以使用 AuthorizationFilterContext 和 RedirectToActionResult 重定向到任何所需的控制器操作>

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasPermissionRequirement requirement)
{
    // Get the context       
    var redirectContext = context.Resource as AuthorizationFilterContext;
    //check the condition 
    if (!result)
    {
        redirectContext.Result = new RedirectToActionResult("AccessDenied", "Home", null);
        context.Succeed(requirement);
        return Task.CompletedTask;
    }
    context.Succeed(requirement);
    return Task.CompletedTask;
}

【讨论】:

  • 在覆盖之前一定要提到要扩展的类
  • @NevilleNazerane 要扩展的类是AuthorizationHandler&lt;T&gt;。
  • 在我的应用程序中,它适用于已发布的项目,但不适用于调试模式。可能是什么原因?
  • 在 .NET Core 6 中,我在 redirectContext 上得到空值。
【解决方案2】:

首先,您可以通过创建这样的自定义方案来配置登录页面/身份验证的条件。

public class SampleScheme : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public const string SchemeName = "sample";

    public SampleScheme(IOptionsMonitor<AuthenticationSchemeOptions> options, 
        ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) 
                    : base(options, logger, encoder, clock)
    {
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        if (myconditions){
            return AuthenticateResult.Fail("error message");
        }
        else {
            return await Context.AuthenticateAsync
            (CookieAuthenticationDefaults.AuthenticationScheme); 
           // return default cookie functionality. 
        }
    }

}

然后您也可以为拒绝/禁止访问创建一个类似的类(比如说SampleScheme2)。 最后你可以在你的 startup.cs 中设置它们

services.AddAuthentication(options => {
    options.DefaultAuthenticateScheme = SampleScheme.SchemeName;
    options.DefaultForbidScheme = SampleScheme2.SchemeName;
})
.AddCookie(options => {
    options.LoginPath = "/login";
    options.AccessDeniedPath = "/forbidden";
})
.AddScheme<AuthenticationSchemeOptions, SampleScheme>(SampleScheme.SchemeName, o => { });
.AddScheme<AuthenticationSchemeOptions, SampleScheme2>(SampleScheme2.SchemeName, o => { });

我希望代码足够自我解释。有一些变化,所以如果这不是你想要的,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多