在MVC 4中同时使用基于声明、基于令牌和表单身份验证

4
我们正在使用Backbone + MVC 4构建单页应用程序。在服务器端(MVC 4)中,我们使用了MVCController(很少)和webapi控制器。目前,我们在应用程序中使用基于表单的身份验证。此外,我们还将用户信息存储在会话中。现在,客户端希望通过其其他Windows /移动应用程序使用这些WebAPI。我们相信我们可以公开所有WebAPI控制器。但是,以下是一些问题:
1)目前,所有WebAPI都受到表单身份验证的保护。但是,当这些WebAPI与Windows /本机移动应用程序一起使用时,基于表单的身份验证将无法工作(因为它在内部使用cookie)。我们必须为其提供基于令牌的身份验证。令牌身份验证是否与声明身份验证相同?
2)我们的授权框架有点复杂,我们必须在用户登录时从数据库中获取所有权限并将其存储在会话中。对于进一步的请求,我们从会话中获取用户权限。sessionId在内部传递cookie。当WebApi从其他应用程序(本机和移动)中调用时,这将无法工作。如果我们可以找到任何其他方法来在服务器上存储此信息,我们可以考虑从应用程序中删除会话使用。
如果没有办法解决问题,我们可以考虑创建另一个项目,在那里复制所有WebAPI并在那里使用基于令牌/声明的身份验证。
提前致谢。
1个回答

1

1) 基于令牌的身份验证提供了执行基于声明的身份验证的手段。它允许您在HTTP请求中传输声明,并通过执行签名验证来验证声明来自可信源。

您应该使用JWT令牌来保护您的API。在您的API中,您检查传入请求头中是否存在JWT令牌,如果存在,则使用令牌处理程序包将令牌解码为ClaimsPrincipal。

一旦您有了主体,您可以使用标准过滤器属性对API端点应用任何授权规则。

2) Web API应该是无状态的,您应该从API层中删除Session使用。

您需要考虑的是...

i) 用户如何在您的系统中唯一地识别自己?您是否有“客户ID”\“用户ID”或其他标识符?(AuthN)

ii) 一旦您能够唯一地识别某个人,如何决定该身份可以访问哪些资源(AuthZ)

当用户登录时,您绝对需要从数据库加载所有权限,还是只加载允许您唯一识别登录的那些权限?

你可以设计一个JWT令牌,其中包含一组声明,允许您在API请求中传递令牌,这样做意味着您不再需要将数据存储在服务器上,因为身份验证和授权信息现在是HTTP请求的一部分。
在此需要良好的设计。如果JWT令牌中包含过多信息,则每个对API的请求都将具有大量有效负载。如果信息不足,则您的API将需要获取其需要进行授权决策所需的任何其他数据。您需要决定正确的平衡点。
请查看Github上的Identity Server。它有一些有用的演示项目,以及通用身份验证主题的良好链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接