如何安全地实现从windows服务到公共WebApi的多租户访问

本文关键字:WebApi 访问 服务 windows 何安全 安全 实现 | 更新日期: 2023-09-27 18:26:53

我正试图弄清楚如何实现一个windows服务(Headless),该服务可以配置为在多租户场景中与我们的WebApi对话。我能找到的最接近的例子是这里发布的在守护进程或长时间运行的进程中调用web API的例子。这个示例的问题是没有显示如何处理多租户场景。如果你为每个租户使用相同的AppKey,如果有人决定在应用程序中搜索ClientID和AppKey,你不可能模拟另一个租户吗?似乎解决这一问题的一种方法是为加入我们服务的每个租户生成一个新的AppKey。当客户安装服务时,需要将此AppKey作为配置参数提供给windows服务。这是正确的方法吗?这似乎不是正确的方向,因为从AAD门户网站上看,哪个AppKey与哪个租户关联并不明显。看来你得自己处理。我知道作为权限的一部分,您必须传递租户ID,但这些ID与AppKey或密码不同。对于这种情况,正确的方法是什么?

我还看了这个示例构建一个由Azure AD保护的多对映web API。不幸的是,这个示例是一个windows商店应用程序。它有UI,所以它可以和AAD一起跳典型的同意舞。显然,我的windows服务不能使用这种方法。我可能能够在windows服务中自托管WebApp,强制用户至少经过一次同意过程,因此令牌像本示例中那样缓存。但是,我使用什么作为重定向URL?这不是一个Windows商店应用程序,所以我不能使用

WebAuthenticationBroker.GetCurrentApplicationCallbackUri();

我不清楚这种情况是否得到支持。

如何安全地实现从windows服务到公共WebApi的多租户访问

后一种方法是可行的。不要为每个租户创建一个密钥,这将是密钥管理的噩梦。

创建一个应用程序,并让它请求您的服务所需的"应用程序权限"。在您的服务可以在给定租户中获得令牌之前,您确实需要获得租户管理员的交互式同意,租户管理员将提供您的应用程序所需的authZ。然后,您的应用程序将能够请求和接收令牌,就像您引用的守护程序文章中一样。

我们通常建议您在管理员注册您的服务时征得他们的同意,这通常有一些互动流程。你绝对可以为这个目的托管一个网站。但你也可以复制用于请求管理员同意的URL,并将其发送给你的客户,而不是托管一些网页。你可以通过电子邮件或其他方式将URL发送给他们。你不需要担心在他们同意后捕获授权响应——你只需要他们登录并授予同意。

我建议使用Owin实现JSON Web令牌(JWT)-请参阅ASP.NET Web API 2中的JSON Web令牌。然后,您可以使用JWT刷新令牌,这本质上允许用户永远保持身份验证,但它们可以被吊销。