AngularJS、.NET Web API 和 back-end 在 SPA 中返回视图时的授权

AngularJS, .NET Web API, and back-end authorization when returning views in a SPA

所以我想使用 AngularJS 和 .NET Web API 编写一个 SPA。我希望 Angular 处理大部分路由。但是如何防止未经授权的用户(无论是否进行身份验证)获得某些视图?我想在 back-end 上执行此操作而不涉及 .NET MVC,因为 MVC returns 整个视图,这违背了 SPA 的目的。同样根据我的理解,Web API 在向客户端返回视图方面没有任何作用。如果这是正确的,那么当返回请求的视图时,Web API 和 MVC 中的授权在 SPA 中变得无用。我考虑编写一些 OWIN 中间件来检查传入 AJAX 调用的 headers,然后确定用户是否有权接收视图。但我不知道从哪里开始。如果编写 OWIN 中间件来处理授权是现实的,我从哪里开始?

这些看起来合理吗?或者我只是疯了,我应该让 .NET MVC 处理返回的视图?

跟进:MVC 和 Web API 都有 [Authorize] 装饰,并且正在传递令牌。身份验证没问题。问题在于Angular。当Angular处理路由时,它向服务器请求视图。但是服务器不会进入 .NET MVC 或 Web API,绕过 MVC 和 Web API 中的授权。它只是返回视图。有前端授权,但这并不理想。因此,当用户被授权接收该视图时,我需要后端处理返回的视图。

有保护 "Web APIs" 的有效案例,您不应该放弃 Web API 上的基本授权(因为即使没有视图,仍然可以访问 API恶意用户。)因此,您最终会希望授权访问前端视图和后端视图 APIs.

但是,为了防止用户访问特定模板,您需要在您希望保护的 "MVC Controllers" 或 "Action Methods" 上应用 Authorize 属性,它们将用于您的模板。听起来好像您的客户端框架正在直接从 Web 服务器获取文件(而不是激活 MVC 控制器操作来接收视图。)

如果您不通过 MVC 控制器提供模板,您将需要一些替代方法来保护模板(例如 OWIN 中间件,是的。)

就我个人而言,我建议使用 MVC 工具以方便使用并在将来继续提供支持。但是,如果您没有任何 MVC 控制器,OWIN 将是更合适的解决方案(例如,当所有逻辑都发生在 SPA 和 APIs 之间时,不需要 MVC。)

为此:

当我使用 knockout 或 angular 创建单页应用程序 (SPA) 时,我通常将所有模板移到部分模板中。然后我使用 MVC 视图和控制器操作来交付这些部分。

这允许我授权访问我的模板。这也使我能够 根据服务器端知识 修改发出的模板内容,无论是安全性还是其他数据。例如,我有时会根据用户角色在模板中使用 User.IsInRole() 到 include/exclude 内容(例如,发出一个为管理员用户提供管理员操作的模板,并发出相同的模板但没有管理员操作的常规用户。)

根据 SPA 的大小和复杂性,我通常在单个页面加载(单个 MVC 视图)中提供整个 SPI。这与假定模板每天来自服务器的框架不兼容(而不是,例如,当前 DOM 中的一个元素),但是它为用户提供了非常快速的体验,根据我的经验,相当复杂的 SPA 的大小仍然小于一些最常见的 javascript框架。

如果应用程序的复杂性或 SLA 需要它,我可能会分批交付 SPA 的各个部分(多个 MVC 视图,作为常规应用程序导航的一部分按需拉入浏览器)。例如,~/Home/Index 本身可能会提供整个应用程序中使用的所有共享模板,但 ~/Account/Index 可能会提供帐户管理视图,而 ~/Uploader/Index 可能会提供资产上传视图。我实际上不需要将这些额外的帐户和上传器模板拉入应用程序,除非我打算使用这些功能。

TL:博士? 使用 MVC 控制器交付包含您的模板的 MVC 视图,并将 [Authorize] 属性应用于需要限制为 authorized/authenticated 用户的任何控制器或操作。为了简单起见,考虑使用 MVC 视图来交付整个 SPA,并进一步考虑使用 MVC 局部视图来帮助组织标记,您应该有类似 ~/Home/Index 的东西,它只不过是 Html.Partial 调用(没有实际标记。)

就是说,现在你已经让我的齿轮转向纯 OWIN 解决方案。如果 SO 上尚不存在,我将尝试在下周左右使用纯 OWIN 方法进行更新。

希望对您有所帮助。

当您使用 AngularJs 开发 SPA 时,您可能会使用 angular-路由扩展。在这种情况下,您的视图只是数据的占位符。所以我想说你最关心的应该是数据(Web API)。你绝对应该为它使用一些身份验证。

对于需要一些非常具体的身份验证的其余视图,您仍然可以将 ASP.NET MVC 与 AngularJs 结合使用。我认为 MVC partials 是一个很好的解决方案。您可以 return 从 angular 控制器渲染部分视图。当然,您可以使用 Ajax.

请求它