AngularJS、.NET Web API以及在SPA中返回视图时的后端授权



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

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

后续:MVC和Web API都有[Authorize]装饰,并且正在传递令牌。身份验证可以。问题出在Angular身上。当Angular处理路由时,它会从服务器请求视图。但服务器不进入.NET MVC或Web API,从而规避了MVC和Web API中的授权。它只是让人回看。有前端授权,但这并不理想。因此,当用户被授权接收返回的视图时,我需要后端来处理该视图。

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

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

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

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

为此:

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

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

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

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

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

也就是说,现在我已经开始使用纯OWIN解决方案了。如果so.上还没有纯OWIN方法,我将在下周左右尝试更新

希望能有所帮助。

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

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

最新更新