Я разрабатываю веб-приложение ASP.NET Core, которое используется для обмена данными между мной и третьей стороной. Приложение использует платформу Microsoft Identity Platform для аутентификации пользователей. Я хочу создать регистрацию приложения только для двух клиентов, чтобы администраторы обоих клиентов могли независимо создавать и удалять пользователей веб-приложения. Пользователям из других арендаторов не должен быть разрешен доступ к приложению.
Вот что я сделал до сих пор:
Мои вопросы:
Вот как выглядит конфигурация AzureAd в файле appsettings.json
:
{
"AzureAd": {
"Instance": "[my instance]",
"Domain": "[my domain]",
"ClientId": "[my client id]",
"TenantId": "organizations",
"CallbackPath": "/signin-oidc"
},
}
Это соответствующий фрагмент кода из Startup.cs
:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddRazorPages()
.AddMicrosoftIdentityUI();
Для управления пользователями вы можете установить разрешение "User.ReadWrite.All", "Directory.ReadWrite.All"
и использовать для этого график.
Я согласен с @Jason Pan, чтобы разрешить доступ к приложению только двум арендаторам, используйте приведенный ниже фрагмент кода.
OnTokenValidated
для фильтрации арендаторов.TenantID
не соответствует, будет выдано исключение несанкционированного доступа.Для образца:
{
"AllowedTenants": ["tenant1", "tenant2"]
}
//get list of allowed tenants from configuration
var allowedTenants = Configuration.GetSection("AzureAd:AllowedTenants").Get<string[]>();
services.Configure<JwtBearerOptions>(
JwtBearerDefaults.AuthenticationScheme, options =>
{
var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
options.Events.OnTokenValidated = async context =>
{
await existingOnTokenValidatedHandler(context);
if (!allowedTenants.Contains(context.Principal.GetTenantId()))
{
throw new UnauthorizedAccessException("This tenant is not authorized");
}
};
});
Вы можете использовать значение идентификатора клиента tid
в маркере доступа, чтобы разрешить или ограничить доступ для определенных клиентов в зависимости от ваших требований.
Для управления пользователями вы можете предоставить User.ReadWrite.All
разрешение API приложению Microsoft Entra ID:
И передайте область как Microsoft Graph:
"DownstreamApis": {
"MicrosoftGraph": {
// Specify BaseUrl if you want to use Microsoft graph in a national cloud.
// "BaseUrl": "https://graph.microsoft.com/v1.0",
"Scopes": [ "User.Read","User.ReadWrite.All" ]
И вызовите API Microsoft Graph. Более подробную информацию можно найти в блоге GitHub и SO Thread доктора Фарида Уддина Кирона.
Использованная литература:
Ограничение мультитенантного приложения в Azure AD — вопросы и ответы Microsoft Василь Мичев