我使用Entity Framework,WebAPI和ASP.NET Identity创建了一个多租户应用程序。基本上它会读取租户的子域,并使用它从数据库中读取连接字符串并在运行时设置它。
一切都很棒,数据库正在创建等,但现在唯一的问题是ASP.NET身份承载令牌。
当我为http://tenant1.#####.com/token生成承载访问令牌时,似乎令牌在同一个应用程序上签名(没有指定机器密钥),并允许访问http://tenant2.#####.com控制器,不应该是这种情况,因为它是不同的子域名/租户。
有什么方法可以解决这个问题吗?或许我应该研究其他安全框架而不是ASP.NET身份?
答案 0 :(得分:3)
MVC5可以轻松地将租户名称声明添加到用户身份。
在Models目录中,修改ApplicationUser
中的IdentityModels.cs
类:
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;
}
然后,当处理经过身份验证的请求时,请验证用户是否包含正确的声明和值。