2013-04-09 45 views
2

在我的asp.net mvc4项目中,我使用ApiControllers为Web客户端和移动客户端提供服务。为了保护Web服务,我使用[Authorize]注释。 所以现在,网络客户端工作正常。但是,当我倾向于从移动应用程序(例如Android)调用某个Web API时,出现错误。 当我的代码片断回头一看:ASP.NET MVC4 Web API和会话变量

[Authorize] 
    public List<double> GetSomeInfo(int param1, string param2) 
     { 
      User user = SessionData.CurrentUser; 
      // do something using user.UserId 
      // .... 

     } 

会话数据并持有,只有当他连接到Web应用程序的用户连接的属性。但对于移动客户端,会话数据为空。那么,有没有什么合适的方法来解决这个问题。 在我看来,我认为userId应作为任何Web API的参数提供,可能需要它来做一些处理。 你觉得呢?

+0

你检出了[IdentityModel](https://github.com/thinktecture/Thinktecture.IdentityModel.45)吗? – 2013-04-09 08:13:25

+0

你正在使用哪种认证?表单身份验证不适用于移动客户端,请考虑使用基本身份验证或数字身份验证 – 2013-04-09 08:13:37

回答

1

你说的是两个不同的东西:

  • 会议

正如达雷尔说,网络API并没有设计,支持Asp.net会话。 HTTP和Rest服务是无状态的 - 因此,每个HTTP请求都应该携带足够的信息,以便接收者对其进行处理,使其与HTTP的无状态特性完全一致。 因此,不要依赖会话变量,而是在请求中添加更多参数。 当然,在Web Api中有一种使用会话的方式,我建议你使用它。

  • 认证

因为只有PARAMATERS(如用户ID,帐户ID,...)工作是不是很安全,你必须使用身份验证和授权。我强烈建议您阅读asp.net web api网站中的security section。 Web Api支持许多身份验证(基本,OAuth,Windows,自定义...)。你必须选择什么是最适合你的。

+0

是的,你是绝对正确的,当我发布这个问题时,我仍然在学习MVC4和Web API,但是我知道我有一个更清晰的想法,并且我完全按照你的建议去做。尊重Web API的无状态定义为了安全起见,我使用了基本认证。现在Web和移动客户端都工作正常 – mahoosh 2013-05-18 16:40:55

+0

完美,好工作先生! – Cybermaxs 2013-05-19 08:11:01

0

Web API的设计不支持会话,因为它们是HTTP反模式。如果您已设置必要的身份验证机制,则可以通过访问Thread.CurrentPrincipal来获取当前已通过身份验证的用户。

+0

我似乎无法理解您在说什么,请提供给我一个链接或一些代码片段? – mahoosh 2013-04-10 11:32:19