【问题标题】:Should I check the authorization of a user inside every view?我应该在每个视图中检查用户的授权吗?
【发布时间】:2018-09-24 13:24:01
【问题描述】:

所以我正在 .NET Core 2.1 中开发一个 MVC 项目。 我使用来自 ASP.NET Identity 的内置 Cookie 身份验证。

当然,我的控制器内所有需要授权的端点都用[Authorize] 注释。但是,我的视图(返回的)是否也需要一种注释形式来定义它们只能被授权的用户访问?如果是这样,你会怎么做?

【问题讨论】:

  • 仅当您(可能)在授权和非授权操作之间共享视图时。否则,除非您获得授权,否则无法联系到他们,因此他们的用户身份验证状态不需要任何进一步的验证。
  • 尽管如此。里面不应该有什么逻辑。仅重用控制器准备的数据。
  • 好的,但是例如:从注销端点调用 LogOutAsync() 后,我仍然可以使用浏览器中的返回按钮再次访问该视图。还是这个问题与我的问题无关?
  • 你的意思是浏览器的“返回”按钮?可能是您的浏览器缓存了该页面。如果您按 F5 重新加载页面,那么 - 如果您的应用程序正常工作 - 它可能会提示您重新登录。(PS 视图本身只是服务器执行控制器操作方法时生成的一些 HTML - 它您提到的都已实现了适当的授权代码。没有其他方法可以让应用程序生成该 HTML,因此视图与控制器方法具有单独授权的概念实际上没有任何意义。)

标签: c# .net asp.net-core-mvc asp.net-identity


【解决方案1】:

在我看来,在 .cshtml 视图中检查身份验证或授权与 MVC 概念相矛盾。当请求到达 MVC 的“视图”部分时,已经有一个相应的控制器参与其中,它完成了它的工作并调用了视图引擎。此时,您已经(或应该)完成了业务逻辑的处理——权限只是另一种形式的业务需求——并以最美妙的方式呈现其结果。

所以具体回答你的问题:

但是,我的视图(被返回的)是否也需要一种注释形式来定义它们只能被授权的用户访问?

由于它们只能通过控制器(或应该)访问,它们不需要额外的注释。

【讨论】:

    【解决方案2】:

    视图或部分视图只能由控制器的任何操作访问,因此如果您在控制器或操作上应用[Authorize] 过滤器,则无需在视图中使用它。

    但如果要在视图中验证用户,则可以使用身份用户的扩展方法IsInRole("Role")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2014-01-06
      • 2010-09-21
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多