记. Abp vNext 租户使用API登录的方法

处理时间:2020年8月20日

ABP版本: ABP vNext 3.0.5 (当时最新版本)

先抄一下ABP官网上对多租户的定义

ABP的多租户模块提供了创建多租户应用程序的基本功能.

维基百科中是这样定义多租户的:

软件多租户技术指的是一种软件架构,这种架构可以使用软件的单实例运行并为多个租户提供服务.租户是通过软件实例的特定权限共享通用访问的一组用户.使用多租户架构,软件应用为每个租户提供实例的专用共享,包括实例的数据、配置、用户管理、租户的私有功能和非功能属性.多租户与多实例架构形成对比,将软件实例的行为根据不同的租户分割开来.


那么问题来了,ABP已实现多租户,还是使用默认单租户模式肯定是不爽的 ,那如果使用多租户来登录并使用ABP呢?

记. Abp vNext 租户使用API登录的方法_第1张图片

使用 默认的方法调用API方式,发现使用租户的帐号行不通了,提示“Invalid username or password!”,可见不是一家人,不认识了。试着在参数中加入tenantId,发现也没用。

记. Abp vNext 租户使用API登录的方法_第2张图片

 分析了一下...

  1. Web版本是可以使用多租户的。
  2. ABP支持多租户,没理由只开放Web功能,肯定姿势错误了。
  3. 根据Web版本的方法,是先选择租户再登录,也就是说需要在在参数中加入tenantId或租户名称,理论上Id的可能行较大。
  4. swagger有个根据id或名称读取“租户Model”,且从业务逻辑上讲,不会有权限要求。

从以上分析,再翻看了官网说明,发现在多租户有一段:

从Web请求中确定当前租户

Volo.Abp.AspNetCore.MultiTenancy 添加了下面这些租户解析器,从当前Web请求(按优先级排序)中确定当前租户.

  • CurrentUserTenantResolveContributor: 如果当前用户已登录,从当前用户的声明中获取租户Id. 出于安全考虑,应该始终将其做为第一个Contributor.
  • QueryStringTenantResolveContributor: 尝试从query string参数中获取当前租户,默认参数名为"__tenant".
  • RouteTenantResolveContributor:尝试从当前路由中获取(URL路径),默认是变量名是"__tenant".所以,如果你的路由中定义了这个变量,就可以从路由中确定当前租户.
  • HeaderTenantResolveContributor: 尝试从HTTP header中获取当前租户,默认的header名称是"__tenant".
  • CookieTenantResolveContributor: 尝试从当前cookie中获取当前租户.默认的Cookie名称是"__tenant".

虽然没有直接说是API方式调用,但从字面上说明需要在 header中添加  __tenant,两个“_",不知道怎么想的。

好了,不费话直接上。

记. Abp vNext 租户使用API登录的方法_第3张图片

 再然后,使用其他业务API都一切正常,在数据库中能顺利加入TenantId值 。

经使用发现,只需要在connect/token(登录)加入__tenant,之后都会在这个租户下操作。

完.

 

你可能感兴趣的:(ABP,netcore,笔记,c#)