AngularJS、.NET Web API 和在 SPA 中返回 View 时的后端授权

标签 angularjs asp.net-mvc asp.net-web-api owin owin-middleware

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

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

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

最佳答案

有保护“Web API”的有效案例,你不应该放弃对你的 Web API 的基本授权(因为即使没有 View ,恶意用户仍然可以访问 API。)因此,你最终会想要授权访问前端 View 和后端 API。

但是,为了防止用户访问特定模板,您需要在您希望保护的“MVC Controller ”或“操作方法”上应用 Authorize 属性,它们将为您的模板提供服务。听起来好像您的客户端框架正在直接从 Web 服务器获取文件(而不是激活 MVC Controller 操作来接收 View 。)

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

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

为此:

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

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

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

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

长话短说:博士? 使用 MVC Controller 交付包含您的模板的 MVC View ,并将 [Authorize] 属性应用于需要限制为授权/认证用户的任何 Controller 或操作。为了简单起见,考虑使用 MVC View 来交付整个 SPA,并进一步考虑使用 MVC 局部 View 来帮助组织标记,您应该有类似 ~/Home/Index 的内容,它只不过是 Html 的集合.Partial 调用(没有实际标记。)

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

希望对您有所帮助。

关于AngularJS、.NET Web API 和在 SPA 中返回 View 时的后端授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28596030/

相关文章:

angularjs - 如何使这个自定义指令更好?

angularjs - 无法使用 Jenkins 构建 Angular 项目

jquery - 每5秒刷新一次表数据

asp.net-mvc - 应用程序池回收后 Autofac 无法解决

javascript - AngularJS - 使用 ngAnimate 时从列表中删除滞后

javascript - 使用 Jasmine toEqual 未定义预期对象

javascript - Json.encode 特殊符号\u003c MVC3

c# - ActionResult 作为 ViewResult 返回 null.. 但我可以显式转换吗?

c# - 包含循环,如果引用跟踪被禁用,则无法序列化,json.net 和 webapi

c# - Web Api Controller 和线程池