【问题标题】:ASP.NET Identity + Bearer Token + Multi-TenantASP.NET 身份 + 承载令牌 + 多租户
【发布时间】:2014-09-14 16:14:39
【问题描述】:

我使用 Entity Framework、WebAPI、ASP.NET Identity 创建了一个多租户应用程序。基本上它读取租户的子域并使用它从数据库中读取连接字符串并在运行时设置它。

一切都很好,正在创建数据库等,但现在唯一的问题是 ASP.NET 身份承载令牌。

当我为http://tenant1.#####.com/token 生成了一个不记名访问令牌时,似乎该令牌是在同一个应用程序上签名的(没有指定机器密钥)并且它也允许访问http://tenant2.#####.com 控制器,这应该'情况并非如此,因为它是不同的子域/租户。

有没有办法解决这个问题?或者也许我应该研究其他安全框架而不是 ASP.NET 身份?

【问题讨论】:

  • 您需要控制令牌并在此处添加自定义数据,即租户名称。由于令牌基于声明,这应该是可能的。然后对每个请求进行另一次检查,以验证当前租户是否与令牌中的租户匹配。例如,此检查可以在自定义 http 模块中完成。
  • 您好,在这种情况下,使用声明是一种“安全”的方法吗?因为只需要能够使用正确的tenantid声明来欺骗令牌并且请求可能会通过吗?
  • 您不能在客户端欺骗令牌。
  • @WiktorZychla 您的解决方案有效,感谢它

标签: c# asp.net asp.net-identity


【解决方案1】:

MVC5 可以轻松地将租户名称声明添加到用户身份。 在 Models 目录中,编辑 IdentityModels.cs 中的 ApplicationUser 类:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
    // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

    // Add claim for tenant name
    userIdentity.AddClaim(new Claim("tenantName", "abcCompany");

    // Add custom user claims here
    return userIdentity;
}

然后在处理经过身份验证的请求时,验证用户是否包含正确的声明和值。

【讨论】:

  • 是否可以获得一个示例,说明如何在您将其添加为声明时获取租户名称?目前正在调查此问题,但也试图避免覆盖 SignInManager 中的所有内容。
  • 我正在做一些类似于用户的事情
  • 这取决于你的实现。租户名称可以基于请求的子域、cookie 值,也可以由用户明确提供。至于访问值,我使用 ASP.NET 用于实现 IPrincipal 和 IIdentity 的相同模式。在内部,IPrincipal 具有对当前用户的每个请求的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2022-01-23
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多