3

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

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

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

4

2 回答 2

3

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

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

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

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

为此:

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

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

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

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

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

也就是说,现在你已经让我的装备开启了纯 OWIN 解决方案。如果 SO 上尚不存在这种方法,我将在下周左右尝试使用纯 OWIN 方法进行更新。

希望有帮助。

于 2015-02-18T23:37:49.783 回答
0

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

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

于 2015-02-18T23:44:18.963 回答