WebApi 2 - 多个同时上下文中的授权,REST 状态管理

WebApi 2 - authorization in multiple simultaneous contexts, REST state management

我有一个 Web Api 2 端点,我正尝试使用自定义授权属性对其进行保护。在该属性内部,我检查用户是否具有必要的角色,例如:

            if (!user.HasRoleInInstitution(institutionId, Role.SomeRole))
            {
                filterContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                return;
            }

我遇到的问题是 institutionId。端点应该可以在机构上下文中访问,在机构上下文中每个用户都可以在不同的机构中拥有不同的角色,因此检查应该检查用户是否在用户正在访问的给定机构中拥有角色。

我可以将当​​前访问的 institutionId 存储在 Session 中,例如:

var session = HttpContext.Current.Session;

然而这:

A) 违反 REST 原则,因为端点应该是无状态的

B) 会话访问往往需要很长时间,因此这会带来在授权等场景中无法容忍的性能开销。

我还可以在每次请求时从客户端传递 institutionId,然后使用 RouteData 在属性中检索它,例如:

var institutionId = filterContext.ControllerContext.RouteData["institutionId"]; 

这种方法的问题是:

A) 如果其他开发人员使用 "someInstitutionId" 而不是 "institutionId" 作为路由参数,那么此检查将中断

B) 在每次请求时传递 institutionId 是对带宽的可怕浪费

最后,我可以向用户添加一个当前访问的 institutionId 道具或传递 cookie,但这会迫使用户在每次他想使用不同的机构时重新登录,并且他不能为不同的机构打开多个应用程序实例这是一个硬性要求。

对于这种情况,最好的方法是什么?

所以你不想使用 Session 因为它反对 REST(那太好了!)但是你不想客户端应用程序在请求中向你发送 institutionId...这是一个逻辑问题.我的意思是想想看。

如果因为您不使用 Session 而不在请求中,客户端应用程序如何为您提供信息?它必须在每个请求中。 而且它不是 "horrible waste of bandwitch",你的 institutionId 不是 2Go 信息所以...

只需使用 JWT,将 institutionId 存储在其中,每次客户端尝试访问您的控制器中的方法时,Authorize 属性将检查他是否获得访问权限,即使他有多个访问权限,它也会非常有效应用程序的实例,因为 institutionId 将由 JWT 在每次请求时提供! :)

如果您不希望用户每次在另一个机构内打开应用程序时都登录,只需让客户端应用程序将 institutionId 写入令牌中即可。因此,他使用 ClientApp1 登录,您给他一个没有 institutionId 的令牌,但是当 ClientApp1 进行调用时,它将 institutionId 写入令牌中,这样您可以检查访问权限,如果客户端打开 ClientApp2,您会自动提供您提供的令牌ClientApp1(也就是没有institutionId的那个)和ClientApp2会覆盖institutionId,发给你ClientApp2相关的institudeId。