Asp.net核心授权重定向到失败的指定路径

时间:2017-08-04 14:41:14

标签: asp.net asp.net-mvc

在“旧”ASP.NET中,我可以构建自定义授权属性并覆盖HandleUnauthorizedRequest 。我似乎无法使用自定义授权处理程序使用ASP.NET Core。后者要么“成功”要么“失败”,我想根据失败的性质重定向到其他控制器动作。

以下是该方案。我的网络应用的用户有一个声明,表明他们是“活跃”用户,即他们已完全注册,我们已经验证了他们的详细信息等。新用户已通过身份验证使用OpenIdConnect中间件,但在我们完全验证并设置其帐户之前,请不要使用“主动”用户声明。因此,新用户和活动用户都已经过身份验证。我想阻止新用户访问大部分应用程序。每当他们尝试前往https://app.example.com/dashboard时,我都希望将其重定向到https://app.example.com/newuser页面,他们可以从中完成设置过程。

我可以在我的控制器上使用授权策略来检查是否存在“有效”用户声明并允许访问。当新用户没有此声明并且授权失败时,我希望授权处理程序具有一些逻辑,然后将它们重定向到他们有权访问的应用程序区域。但我不知道如何使用ASPNET核心中的授权框架来实现这一点。

有一个有点笨重的解决方案,它使用CookieMiddleware并为OnRedirectToAccessDenied事件实现处理程序 - 请参阅https://github.com/aspnet/Mvc/issues/4890。我还想过实现一个在每个请求上运行的动作过滤器。

我只是在这里傻吗?当然,想要对授权失败执行某些操作是有意义的,这不仅会让用户重新进行身份验证。

1 个答案:

答案 0 :(得分:7)

经过一番挖掘和参考这本精彩的书, Pro ASP.NET Core MVC(第6版,Adam Freeman)之后,我的问题的简单答案是创建一个授权过滤器。这使用单个方法OnAuthorization(AuthorizationFilterContext context)实现 IAuthorizationFilter 。在此方法中,执行检查请求所需的任何操作。如果授权失败,只需将context.Result属性设置为某些IActionResult,在我的案例中为RedirectToActionResult。如果请求通过授权什么都不做。

你也可以在过滤器中使用依赖注入 - 太棒了。

没有提及如何在Microsoft ASP.NET文档站点上为IAuthorizationFilter实现或编码示例。感谢Adam Freeman。