【问题标题】:Custom Auth request in ServiceStack for multi-tenancyServiceStack 中用于多租户的自定义身份验证请求
【发布时间】:2015-01-28 02:03:11
【问题描述】:

我已经在基于 ServiceStack 的 Web 服务应用程序中使用了自定义身份验证提供程序。

我正在重写 Authenticate 方法,并针对多个后端租户数据库之一验证我的用户。我目前通过将 API 密钥与数据库字符串匹配来确定租户数据库。

public override object Authenticate(
   IServiceBase authService, 
   IAuthSession session, 
   Auth request) // <- custom object here, MyCustomAuth request
{
   // ...
}

当每个应用程序都用于单个租户(租户/客户可以构建自己的应用程序并使用该 API 密钥)时,此方法有效。展望未来,我想构建一个多租户移动应用程序。因此无法使用 API 密钥方法,因为我不能期望每个用户都输入它,因此我无法确定哪个租户正在使用该应用程序。

我想更改 Auth 对象,以便可以包含 TenantId(由用户在登录时提供)。但是,我看不到如何自定义该对象。

是否可以自定义该 Auth 对象,还是我必须找到替代解决方案?

【问题讨论】:

    标签: authentication servicestack


    【解决方案1】:

    您不能修改使用的内置Authenticate Request DTO,但您可以使用其Dictionary&lt;string, string&gt; Meta 属性来发送附加的元数据与Authenticate 请求,例如:

    client.Post(new Authenticate {
        ...
        Meta = new Dictionary<string,string> {
            {"TenantId", tenantId},
        }
    }
    

    或者,您可以在 QueryString 或 HTTP 标头中发送附加信息,并通过以下方式访问 IRequest

    var tenantId = authService.Request.QueryString["TenantId"];
    

    【讨论】:

    • Meta 属性是 v3.9.x 后的版本吗?另外,对于相同的 3.9.x 版本 (.48) 我假设我需要做 authService.RequestContext.Get&lt;IHttpRequest&gt;().Items["TenantId"] ?
    • @Junto Authenticate.Meta 在 v4 中添加。这就是在 v3 中访问当前请求的方法,但如果您要查找的是 QueryString,您仍然需要查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多