我们正在使用Backbone + MVC 4构建单页应用程序。在服务器端(MVC 4),我们使用了MVCController(非常少)和webapi控制器。在此应用程序中,我们使用了基于表单的身份验证。此外,我们也在Sessions中存储用户信息。现在,要求客户端也希望通过其他Windows /移动应用程序使用这些webapi。我们相信我们可以公开所有webapi控制器。但这里几乎没有什么问题:
1)目前,所有webapi都使用表单身份验证进行保护。但是,当这些webapi将与Windows /本机移动应用程序一起使用时,基于表单的身份验证将不起作用(因为它在内部使用cookie)。我们必须为它提供基于令牌的身份验证。基于令牌的身份验证与基于声明的身份验证相同吗
2)我们的授权框架有点复杂,当用户登录并将其存储在会话中时,我们必须从数据库中获取所有权限。对于进一步的请求,我们从会话中获取用户权限。内部sessionId在cookie中传递。当WebApi从其他应用程序(本机和移动设备)中被攻击时,这将不起作用。如果我们可以找出在服务器上存储此信息的任何其他方法,我们可以考虑从应用程序中删除会话使用情况。
如果没有任何作用,我们可以考虑再创建一个项目,我们将复制所有webapi并在那里使用基于令牌/声明的身份验证。
提前致谢
答案 0 :(得分:1)
1)基于令牌的身份验证提供了执行基于声明的身份验证的方法。它允许您通过HTTP请求传输声明,并通过执行签名验证来验证声明来自可信来源。
您应该使用JWT token保护您的API。在API中,检查传入请求标头中是否存在JWT标记,如果存在,则使用标记处理程序包将标记解码为ClaimsPrincipal。
拥有主体后,您可以使用标准过滤器属性将您喜欢的任何授权规则应用于API端点
2)Web API应该是无状态的,您应该从API层中删除会话使用情况。
您需要考虑的是......
i)用户如何在系统中唯一标识自己?你有一个'客户ID'用户ID'或其他一些标识符? (AuthN)可以
ii)一旦您能够唯一地识别某人,您如何确定允许该身份访问的资源(AuthZ)
您是否绝对需要在用户登录时从数据库加载所有权限,或者只是那些允许您唯一标识登录的权限?
您可以设计一个JWT令牌,其中包含一组允许您在API请求上传递令牌的声明,这样就意味着您不再需要将数据存储在服务器上,因为authn \ authz信息现在是HTTP请求。
这里需要良好的设计。 JWT令牌中的信息过多,对API的每个请求都将具有较大的有效负载。没有足够的信息,您的API将需要去获取做出授权决策所需的任何其他数据。您需要确定正确的余额。
看看Identity Server on Github。它有一些有用的演示项目,以及与常规身份验证主题的良好链接。