- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我想使用 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 应用程序的最佳实践方法?我正在向现有网页添加新功能,需要传入一个参数。具体来说,有一组选项卡,一个新选项卡将启动一个 Angular
找不到这两者之间的区别。 保留其中任何一个来引导我的 Angular 应用程序是否有意义? angular.bootstrap(document,['myApp']); 或者 angularAMD.b
我试图理解 Packpub 的书附带的示例 AngularJS 应用程序。 app.js文件在 client/src/app 下定义文件夹,它的模块定义看起来像 angular.module('app
Angularjs 具有用于表单验证和显示错误消息的强大基础设施。但是,我处于必须在特定场景中向用户显示警告消息的情况。这是我的简单表格的图表 该表单在两个字段上都应用了必需和模式验证。除了此验证之外
我在重试功能正常工作时遇到了一些麻烦,希望能获得一些帮助。我有一个要调用的$ resource,直到出现成功情况或超过最大重试次数为止。 我似乎遇到的问题是,在我的重试函数中,我正在调用另一个prom
我目前正在开发一个 AngularJS 应用程序,我遇到了以下障碍。 当用户提交时,我们有一个 login 页面,我们调用一个 web api 并对用户进行身份验证,我们目前正在使用 claims 身
当范围更新时,指令的属性不会改变,它们仍然保持初始值。我在这里缺少什么? HTML works great works: {{foo}} Javascript (基于首页上的 A
我正在使用 Zurb 的 Foundation 框架修改应用程序以实现响应性和 AngularJS。存在数据显示在带有 ... 的表中的错误有 是根据 Foundation 的响应规则隐藏/显示的。不
在过去的三天里,我一直在搜寻互联网,试图弄清楚当angular注意到div的宽度发生变化时如何使指令运行。 我不断看到相同的示例,说明如何实现此目标,但是它们对我不起作用,我也不知道为什么。 我回到一
我正在使用以下代码尝试汇总 在 Angular ,这在整个作品中,但是小于 0.5 的数字四舍五入为 0。我想 向上取整 每个数字到下一个整数。例如 0.02 应四舍五入为 1 {{((data.Vi
我目前正在尝试以一种能够适当扩展到企业级别的方式来组织我的 Angular 应用程序。但是我发现似乎过度依赖框架内的命名约定,并且试图避免命名冲突是一个真正的问题。 例如,当定义任何 constant
我正在阅读 AngularJS 基础知识,并且喜欢在我的页面中使用它的绑定(bind)功能。所以我可以定义可以在 View 中显示的数据,可以对数据进行更改,以便在 View 中更改它而无需担心。 在
在父 Controller 范围内,我定义了 selectedItem设置为“x”。然后在子范围内,我定义了selectedItem使用 ngModel:
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
如果2个条件为真,我试图将一个特定的类应用于li元素,因此我编写了以下代码,但似乎无法正常工作 ng-class="{current:isActive('/'), loginStatus: false
请看看朋克。 http://plnkr.co/edit/DuTFYbLVbPkCIvRznYjG?p=preview ng-pattern regEx不适用于输入文本字段。 仅在需要验证的情况下才能正
我正在为iOS + Android构建AngularJS(1.x)和Ionic/Cordova移动应用程序。我想在登录页面上添加/创建“深层链接”,以便在我向新用户发送“确认您的电子邮件”电子邮件时,
angularjs 中服务(或工厂)的生命周期是什么,何时重新初始化? 最佳答案 当 Angular 启动时,它会将服务的构造函数附加到关联的模块上。这种情况发生一次。 angular .modu
我对 Angular 很陌生,所以希望我知道的足够多,可以问什么似乎是合理的设计问题。 我正在通过 Angular 绘制一些数据,并且正在使用 $resource。在将 Angular 引入项目之前,
我需要在我的 angular-breeze 应用程序中使用国家/地区下拉菜单,我尝试了以下操作: https://github.com/banafederico/angularjs-country-s
我是一名优秀的程序员,十分优秀!