c# – 具有多租户数据访问的Web API身份验证
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 具有多租户数据访问的Web API身份验证,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1963字,纯文字阅读大概需要3分钟。
内容图文
![c# – 具有多租户数据访问的Web API身份验证](/upload/InfoBanner/zyjiaocheng/819/3cf8e34e7f854fe681566a704bd3b9d3.jpg)
我不确定我是否使用了正确的标题,但我无法想出更好的方式来描述它.这可能更像是一个设计问题.
我有一个多租户数据库,其中一个用户可以属于一个或多个实体.我通过调用/ token端点使用他/她的凭据对用户进行身份验证.
收到令牌后,我调用自己的终点(使用令牌)获取该用户的可用实体列表,然后允许该用户在内存缓存中设置其当前实体.然后,我在内存缓存中使用它来查找所有后续请求的实体/租户ID,以便在调用DB时知道用户“登录”了哪个实体/租户.
理想情况下,我希望消除对内存缓存的需要,以便通过在代理中包含实体/租户ID作为声明来使我的应用程序更无状态,但在用户验证并选择他/她的实体后我才知道此ID .在令牌发布后,我显然无法更改或添加声明但是有没有其他设计来实现这种行为?
我认为可能每个租户使用一个子域,但从技术上讲,这更难以设置和维护.我还考虑过提示用户输入他/她希望以其凭据登录的实体作为自由文本,但这并不理想.
以前有人遇到过这个挑战吗?
解决方法:
我同意您的意见,租户选择必须以无状态方式完成,以避免在基于REST的架构中进行有状态的交互.缓存方法可能会导致许多陷阱,并引入对基于会话的交互的强烈依赖.
我可以想到两个主要选择,使租户选择无国籍:
>基于URI的选择:您可以在API中添加一个租户参数,在所有控制器之间共享.类似于这样的映射:api / {tenantId} / {controller} / {id}可以允许您以简单的方式在客户端之间切换租户.这可以使用基于约定的路由完成:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{tenantId}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
或者基于属性的路由,在控制器上使用RoutePrefixAttribute:
[RoutePrefix("api/{tenantId}/myentities")]
public class EntityController : ApiController
{
[Route("")]
public IHttpActionResult GetAllEntities(string tenantId)
{
//...
>基于标题的选择:您可以考虑添加自定义HTTP标头,其中包含有关所选租户的信息:例如X-Tenant-Selection:TenantId,然后你可以读取这个Header inside a custom Filter,或者在Web API之前执行的OwinMiddleware中,并设置一个上下文变量(甚至是用于当前请求的用户声明)在你的控制器中使用.
当然,在这两种情况下,您都必须验证当前用户在返回数据之前是否可以访问所选租户.
坦率地说,我会排除在访问令牌中包含tenantId的可能性,而子域方法对我来说似乎太复杂了.
内容总结
以上是互联网集市为您收集整理的c# – 具有多租户数据访问的Web API身份验证全部内容,希望文章能够帮你解决c# – 具有多租户数据访问的Web API身份验证所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。