2017-08-04 48 views
2

在“旧”ASP.NET中,我可以构建自定义授权属性并覆盖HandleUnauthorizedRequest。我似乎无法使用自定义授权处理程序在ASP.NET Core中执行此操作。后者要么“成功”,要么“失败”,我想根据失败的性质重定向到替代控制器操作。Asp.net核心授权重定向到发生故障的指定路径

以下是这种情况。我的网络应用程序的用户有一个声明,表明他们是“活跃”用户,即他们已经完全注册并且已验证他们的详细信息等。新用户已经使用OpenIdConnect中间件进行了身份验证,但是,直到我们完全验证并设置注册他们的账户,没有“积极”的用户主张。因此,新用户和活动用户都已被认证。我想阻止新用户访问大部分应用程序。每次他们尝试访问https://app.example.com/dashboard我想将它们重定向到一个https://app.example.com/newuser页面,从中可以完成设置过程。

我可以在我的控制器上使用授权策略来检查是否存在“活动”用户声明并允许访问。当新用户没有此声明并且未通过授权时,我希望授权处理程序拥有一些逻辑,然后将它们重定向到他们有权访问的应用程序区域。但我不明白如何使用ASPNET核心中的授权框架来完成此操作。

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

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

回答

3

一些挖约和参照精彩的书后,临ASP.NET MVC核心(第6版,亚当·弗里曼),简单的回答我的问题是创建一个授权过滤器。这通过单个方法OnAuthorization(AuthorizationFilterContext context)实现IAuthorizationFilter。在这种方法中,做任何你需要做的事来检查请求。如果授权失败,只需将context.Result属性设置为一些IActionResult,在我的情况下为RedirectToActionResult。如果请求通过授权,则什么也不做。

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

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