如何在客户端探测授权访问

时间:2014-02-24 08:48:57

标签: servicestack

到目前为止,我主要使用一个asp.net app隐喻,其中剃刀页面与来自同一应用程序的数据一起提供,因此我可以使用相同的安全性保护ui和数据控制器操作的某些控制器操作

我的新应用程序有一个完全独立的api网站(使用servicestack)和一个消耗api的不同asp.net UI应用程序。现在这两个应用程序位于同一台服务器上,但我想支持任何人编写一个消耗我的数据的UI应用程序的能力,因此应用程序可以放在任何地方,可以是我所关心的php应用程序。

新的UI使用razor和MVC,但它实际上是一个完全客户端应用程序,它从api站点请求数据。

所以,问题就在那里。当有人还没有登录时,我习惯于自动将页面从服务器端重定向到登录。我的UI服务器端没有关于api网站登录情况的概念。

我现在能做的最好的事情是,在任何UI页面加载的乞讨时,对api网站进行轻量级的ajax调用,以获取当前的用户信息。如果它为null,我做一个客户端document.location.href =。

这有效,但有问题,主要是它导致很多客户端忙于ui的东西。 UI的初始版本加载空(无数据),然后发生到登录页面的尴尬重定向。客户端应用程序变得很健谈 - 每个加载的页面都会对api站点进行额外调用。服务器端重定向是干净的,因为您看到的第一个页面是您可以访问的UI页面或登录页面。

我的第一个问题是,做这种事情的最佳做法是什么?我的第二个问题是,我的UI页面上是否有客户端cookie确定性地告诉我我已登录到api站点?我在登录之前和之后检查了UI页面上的cookie,它将安全性设置为api站点,并且cookie似乎是相同的。我的第三个问题是 - 我可以为我的UI mvc网站编写某种安全操作过滤器,它以某种方式从请求的cookie中神奇地确定UI是否当前登录到api站点,如果是,则让它请求服务于页面,如果没有,则服务器端重定向到登录页面。

由于

编辑: 斯科特 - 非常感谢您的详细解释。一个澄清 - 我只使用mvc来真正服务我的客户端html。我使用所有knockoutjs和Ajax调用servicestack来呈现数据。我的问题是关于如何对返回安全异常的Ajax调用做出反应以及如何避免呈现空的html ui,因为用户没有登录。我的登录页面直接从html进行身份验证,绕过mvc部分。它不是一个水疗中心,我可以保持一个客户端登录状态,适用于水疗中心的所有视图。有多个cshtml页面都需要探测登录,以便不加载空并重定向到登录页面...

1 个答案:

答案 0 :(得分:2)

所以MVC只提供空白模板,包括将调用API来填充它的淘汰赛js?我相信此流程会显示当前页面如何使用a lightweight ajax call to the api测试会话。

Current

正如您所指出的那样,该方法的问题在于它有开销,如果没有会话则会有明显的延迟。

解决方案:

由于原点差异,您无法在JavaScript客户端应用程序中测试ss-id cookie。知道这个cookie存在会告诉您用户是否可能有一个有效的会话。但是看到你无法访问它,你必须解决这个问题。当您的登录页面通过调用API成功创建会话时,您应该使用success方法创建一个表示您有会话的cookie。例如hasSession cookie。

您可以在每次加载页面时检查此Cookie是否存在。它不涉及服务器旅行来验证它。如果该cookie具有与ServiceStack API cookie相同的过期策略,则它应保持同步。

Suggested

初始cshtml页面状态应该使用CSS隐藏未填充的页面表单联系人,并显示加载指示符,直到从API加载数据。

首次加载页面时,应检查hasSession cookie是否存在?如果没有,那么它不应该进行任何API调用,并应立即重定向登录。

  

我怎么知道我可以调用ajax调用并成功而不进行测试调用?

如果你有ss-id cookie ,你应该假设你有一个会话hasSession cookie,因为你必须已成功登录才能获得它。因此,请您调用页面数据。如果从调用中获取数据而不是401异常,则填充表单,并通过更改CSS来显示它。

如果您有401重定向到登录屏幕,并删除hasSession cookie。用户不会看到空白的未填充表单,因为CSS阻止了这一点。他们在等待时得到一个加载指示器,这是一个非常合理的状态。

401授权错误应该只发生一次,并重定向到登录,如果您的hasSessionss-id Cookie过期保持同步,则不会发生这种情况。

我很困惑为什么你现在试图改变ServiceStack属性,继承[Authorize]。您不应该更改API的行为。