如何在 azure ad scim 配置中支持多个租户和秘密令牌
How to support multiple tenants and secret tokens in azure ad scim provisioning
我正在尝试为我们的 Saas 产品创建 Azure AD 配置(使用 scim2)。
我希望多个客户能够连接到他们的 Azure AD 租户。
微软在这里有参考代码:https://github.com/AzureAD/SCIMReferenceCode
但是,该设置只允许一个租户,并且不使用您在 azure ad 中设置的“秘密令牌”。即使评论明确指出秘密令牌不应为生产留空。
这是参考项目中的重要代码片段
// Leave the optional Secret Token field blank
// Azure AD includes an OAuth bearer token issued from Azure AD with each request
// The following code validates the Azure AD-issued token
// NOTE: It's not recommended to leave this field blank and rely on a token generated by Azure AD.
// This option is primarily available for testing purposes.
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = this.configuration["Token:TokenIssuer"];
options.Audience = this.configuration["Token:TokenAudience"];
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
// NOTE: You can optionally take action when the OAuth 2.0 bearer token was validated.
return Task.CompletedTask;
},
OnAuthenticationFailed = AuthenticationFailed
};
});
假设 Token:TokenIssuer 设置为 https://sts.windows.net//,使用该代码可以正常工作,其中 tenant_id 是实际租户 ID,TokenAudience 是 8adf8e6e-67b2-4cf2 -a259-e3dc5476c621(非图库应用)。
但只有当我在 azure ad(Entrprise 应用程序下的非画廊应用程序)中设置时将“秘密令牌”留空时,它才有效。
我已经尝试了各种各样的事情,添加 OnChallenge 告诉我如果我设置了“秘密令牌”就会发送一个挑战,但除此之外我没有取得更多进展。
此处处理多个租户和秘密令牌的任何示例代码都很棒
更新:
使用 options.TokenValidationParameters.IssuerValidator 我可以验证发行者,从而使其适用于多个租户。我现在真正无法克服的是当我在此处输入“秘密令牌”时使呼叫正常工作:(见图)
您可以访问Managing user account provisioning for enterprise apps in the Azure portal了解更多设置信息:
所以我发现他们想要的是我在该字段中生成的 JWT 令牌。
所以首先我创建了一个生成网络令牌的方法
private string GenerateJSONWebToken()
{
// Create token key
SymmetricSecurityKey securityKey =
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Token:TokenSigningKey"]));
SigningCredentials credentials =
new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
// Set token expiration
DateTime startTime = DateTime.UtcNow;
DateTime expiryTime = startTime.AddMinutes(120);
// Generate the token
JwtSecurityToken token =
new JwtSecurityToken(
configuration["Token:TokenIssuer"],
configuration["Token:TokenAudience"],
null,
notBefore: startTime,
expires: expiryTime,
signingCredentials: credentials);
string result = new JwtSecurityTokenHandler().WriteToken(token);
return result;
}
在我的 appsettings.json 我添加了
{
"Logging": {
...
},
"Token": {
"TokenAudience": "xxx-xxx-xxx-xxx",
"TokenIssuer": "https://sts.windows.net/yyyy-yyyy-yyyy/",
"TokenSigningKey": "zzz"
}
}
- 令牌受众我设置为 8adf8e6e-67b2-4cf2-a259-e3dc5476c621 可在此处阅读 https://docs.microsoft.com/en-us/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups.
TL;DR 令牌的受众将是库中应用程序的应用程序模板 ID,所有自定义应用程序的应用程序模板 ID 为 8adf8e6e-67b2-4cf2 -a259-e3dc5476c621
- TokenIssuer 的 yyyy 部分是 azure ad 租户的租户 id
- 来自签名密钥的 zzz 只是您选择的密钥。
现在我终于生成了一个包含来自 appsettings.json 的值的令牌。
然后我将此密钥粘贴到 Azure AD 的“秘密令牌”字段中。
最后,如何实现这个多租户(我的下一步)
- 从 appsettings.json
中删除 Token:TokenIssuer
- 当您调用 GenerateJSONWebToken 时,在客户端 Azure AD 租户 ID 中发送并使用它而不是来自 appsettings.json 的静态值(您的客户端会给您这个,或者您通过将您的应用程序连接到他们来获得它)
- 在startup.cs 通知中,我已经实现了 IssuerValidator。更新它以验证不是针对 appsettings.json 而是针对您的数据存储。
我正在尝试为我们的 Saas 产品创建 Azure AD 配置(使用 scim2)。 我希望多个客户能够连接到他们的 Azure AD 租户。
微软在这里有参考代码:https://github.com/AzureAD/SCIMReferenceCode
但是,该设置只允许一个租户,并且不使用您在 azure ad 中设置的“秘密令牌”。即使评论明确指出秘密令牌不应为生产留空。
这是参考项目中的重要代码片段
// Leave the optional Secret Token field blank
// Azure AD includes an OAuth bearer token issued from Azure AD with each request
// The following code validates the Azure AD-issued token
// NOTE: It's not recommended to leave this field blank and rely on a token generated by Azure AD.
// This option is primarily available for testing purposes.
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = this.configuration["Token:TokenIssuer"];
options.Audience = this.configuration["Token:TokenAudience"];
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
// NOTE: You can optionally take action when the OAuth 2.0 bearer token was validated.
return Task.CompletedTask;
},
OnAuthenticationFailed = AuthenticationFailed
};
});
假设 Token:TokenIssuer 设置为 https://sts.windows.net/
我已经尝试了各种各样的事情,添加 OnChallenge 告诉我如果我设置了“秘密令牌”就会发送一个挑战,但除此之外我没有取得更多进展。
此处处理多个租户和秘密令牌的任何示例代码都很棒
更新:
使用 options.TokenValidationParameters.IssuerValidator 我可以验证发行者,从而使其适用于多个租户。我现在真正无法克服的是当我在此处输入“秘密令牌”时使呼叫正常工作:(见图)
您可以访问Managing user account provisioning for enterprise apps in the Azure portal了解更多设置信息:
所以我发现他们想要的是我在该字段中生成的 JWT 令牌。
所以首先我创建了一个生成网络令牌的方法
private string GenerateJSONWebToken()
{
// Create token key
SymmetricSecurityKey securityKey =
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Token:TokenSigningKey"]));
SigningCredentials credentials =
new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
// Set token expiration
DateTime startTime = DateTime.UtcNow;
DateTime expiryTime = startTime.AddMinutes(120);
// Generate the token
JwtSecurityToken token =
new JwtSecurityToken(
configuration["Token:TokenIssuer"],
configuration["Token:TokenAudience"],
null,
notBefore: startTime,
expires: expiryTime,
signingCredentials: credentials);
string result = new JwtSecurityTokenHandler().WriteToken(token);
return result;
}
在我的 appsettings.json 我添加了
{
"Logging": {
...
},
"Token": {
"TokenAudience": "xxx-xxx-xxx-xxx",
"TokenIssuer": "https://sts.windows.net/yyyy-yyyy-yyyy/",
"TokenSigningKey": "zzz"
}
}
- 令牌受众我设置为 8adf8e6e-67b2-4cf2-a259-e3dc5476c621 可在此处阅读 https://docs.microsoft.com/en-us/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups.
TL;DR 令牌的受众将是库中应用程序的应用程序模板 ID,所有自定义应用程序的应用程序模板 ID 为 8adf8e6e-67b2-4cf2 -a259-e3dc5476c621
- TokenIssuer 的 yyyy 部分是 azure ad 租户的租户 id
- 来自签名密钥的 zzz 只是您选择的密钥。
现在我终于生成了一个包含来自 appsettings.json 的值的令牌。 然后我将此密钥粘贴到 Azure AD 的“秘密令牌”字段中。
最后,如何实现这个多租户(我的下一步)
- 从 appsettings.json 中删除 Token:TokenIssuer
- 当您调用 GenerateJSONWebToken 时,在客户端 Azure AD 租户 ID 中发送并使用它而不是来自 appsettings.json 的静态值(您的客户端会给您这个,或者您通过将您的应用程序连接到他们来获得它)
- 在startup.cs 通知中,我已经实现了 IssuerValidator。更新它以验证不是针对 appsettings.json 而是针对您的数据存储。