Αυτή η ανάρτηση εξετάζει την εφαρμογή και τη χρήση πολλαπλών εφαρμογών ενοικιαστών Azure AD από διαφορετικούς ενοικιαστές. Πρέπει να δημιουργηθεί μια αρχή υπηρεσίας για τον ενοικιαστή που χρησιμοποιεί το API πολλών ενοικιαστών και πρέπει να δοθεί συγκατάθεση για το εύρος του API. Το API θα δέχεται διακριτικά από διαφορετικούς εκδότες που πρέπει να επικυρωθούν. Είναι σημαντικό να επικυρώνονται όλοι οι ενοικιαστές που επιτρέπεται να χρησιμοποιούν το API.
Κώδικας: https://github.com/damienbod/AadMutliApis
Ρύθμιση API Azure App Registration
Μια εγγραφή API Azure App πολλαπλών ενοικιαστών χρησιμοποιείται για να αποκαλύψει το εύρος που απαιτείται για τη χρήση του API. Το API υλοποιείται με χρήση του ASP.NET Core και επικυρώνει αυτήν την αξίωση στο διακριτικό JWT καθώς και σε άλλες αξιώσεις. Απαιτούνται διακριτικά V2 και δημιουργούνται μόνο τα διακριτικά πρόσβασης με ανάθεση από αυτήν την εγγραφή εφαρμογής.

Εφαρμόστε το API
Μια εφαρμογή ASP.NET Core υλοποιεί το API και τη λογική ασφαλείας που επικυρώνει το διακριτικό πρόσβασης. Μια ρητή λίστα εκδοτών μπορεί να χρησιμοποιήσει το API Το API επικυρώνει ότι απαιτείται ένα μυστικό για τον έλεγχο ταυτότητας και ο πελάτης που ζήτησε το διακριτικό πρόσβασης επικυρώνεται επίσης. Ο χειριστής εξουσιοδότησης επικυρώνει ότι το διακριτικό έχει αξίωση εμβέλειας, πράγμα που σημαίνει ότι είναι ένα διακριτικό πρόσβασης με ανάθεση (εάν παράγεται από την Azure AD). Πρέπει να δίνεται μεγάλη προσοχή κατά τη χρήση εγγραφών εφαρμογών πολλαπλών ενοικιαστών, επειδή οποιοσδήποτε ενοικιαστής μπορεί να το χρησιμοποιήσει, αλλά δεν πρέπει να επιτρέπεται σε κανέναν ενοικιαστή να χρησιμοποιεί το API.
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.MetadataAddress = aadMetadataAddress;
//options.Authority = issuert1;
options.Audience = aud;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidAudiences = new List<string> { aud },
ValidIssuers = new List<string> { issuert1 }
};
});
services.AddSingleton<IAuthorizationHandler, ValidTenantsAndClientsHandler>();
services.AddAuthorization(policies =>
{
policies.AddPolicy("ValidTenantsAndClients", p =>
{
// only delegated trusted known clients allowed to use the API
p.Requirements.Add(new ValidTenantsAndClientsRequirement());
// Validate id of application for which the token was created
p.RequireClaim("azp", azpClientId);
// client secret = 1, 2 if certificate is used
p.RequireClaim("azpacr", "1");
});
});
services.AddControllers(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
Ο χειριστής επικυρώνει ότι η αξίωση εύρους έχει την αναμενόμενη τιμή. Μαζί με την υπόλοιπη επικύρωση, είναι δυνατή η επικύρωση ότι το διακριτικό πρόσβασης προορίζεται για αυτό το API.
public class ValidTenantsAndClientsHandler
: AuthorizationHandler<ValidTenantsAndClientsRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
ValidTenantsAndClientsRequirement requirement)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (requirement == null)
throw new ArgumentNullException(nameof(requirement));
var scopeClaim = context.User.Claims.FirstOrDefault(t => t.Type == "scope");
if (scopeClaim != null)
{
var scopes = scopeClaim.Value.Split(" ",
StringSplitOptions.RemoveEmptyEntries);
if (scopes.Any(t => t == "access_as_user"))
{
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}
Setup Service Principal για άλλους ενοικιαστές
Τώρα που η εφαρμογή είναι έτοιμη και υπάρχει η εγγραφή της εφαρμογής, μπορεί να δημιουργηθεί μια κύρια υπηρεσία για αυτήν την εγγραφή της εφαρμογής Azure στον ενοικιαστή-στόχο.
Connect-AzureAD -TenantId '<UI-tenantId>'
New-AzureADServicePrincipal -AppId 'AppId-from-multi-tenant-api'
Δώστε συγκατάθεση στον ενοικιαστή σας για τις αιτήσεις Enterprise
Η κύρια υπηρεσία μπορεί να βρεθεί στη λεπίδα εφαρμογών Enterprise.
- Ανοίξτε τη λεπίδα Enterprise Applications
- Βρείτε την εταιρική σας εφαρμογή χρησιμοποιώντας το Guid ObjectId από το σενάριο Powershell
- Ανοίξτε τη λεπίδα αδειών
- Παραχωρήστε τη συναίνεση του διαχειριστή εάν θέλετε να χρησιμοποιήσετε τοπικά δικαιώματα ενοικιαστών
Χρήση και συναίνεση
Για να χρησιμοποιήσετε την εφαρμογή διεπαφής χρήστη και το API πολλών ενοικιαστών, πρέπει να δοθεί συγκατάθεση, συνήθως από έναν διαχειριστή ενοικιαστή εκ μέρους όλων των χρηστών σε αυτόν τον ενοικιαστή. Εμφανίζονται διαφορετικές οθόνες συναινέσεις ανάλογα με τις πολιτικές ενοικιαστών του Azure και το άτομο που χρησιμοποιεί την εφαρμογή.

Μόλις δοθεί η συναίνεση, αυτή μπορεί να προβληθεί στα δικαιώματα API της εφαρμογής Enterprise που δημιουργήθηκε για τον στοχευόμενο μισθωτή.

Το επιπλέον βήμα της ρητής δυνατότητας στους ενοικιαστές που μπορούν να χρησιμοποιήσουν το API έχει πλεονεκτήματα. Μπορείτε να συνεχίσετε να χρησιμοποιείτε ανατεθειμένα πεδία και να εφαρμόζετε πρωτόκολλα ανταλλαγής διακριτικών για τα μεταγενέστερα API όπου απαιτείται. Αυτός είναι ένας ασφαλής τρόπος σύνδεσης συστημάτων λογισμικού χρησιμοποιώντας διαφορετικούς παρόχους ταυτότητας, εάν εφαρμοστεί σωστά. Ένα μειονέκτημα της προσέγγισης είναι ότι κάθε διαχειριστής πρέπει να δώσει τη συγκατάθεσή του για τη χρήση του API στον μισθωτή του.