J'ai une application Asp.NET MVC connectée à Azure AD B2C.
Dans les paramètres administrateur, j'ai créé un groupe d'administrateurs:
Dans mon code, je voudrais utiliser [Authorize(Roles = "Administrator")]
Avec Azure Active Directory standard, il était facile d'ajouter (seulement 3 lignes de code). Mais pour Azure AD B2C, je ne trouve aucun tutoriel ou exemple sur le Web qui fonctionne. Vous pouvez peut-être me dire ce que je dois modifier.
Voici la méthode ConfigureAuth de mon Startup.Auth.cs
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
// Generate the metadata address using the tenant and policy information
MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),
// These are standard OpenID Connect parameters, with values pulled from web.config
ClientId = ClientId,
RedirectUri = RedirectUri,
PostLogoutRedirectUri = RedirectUri,
// Specify the callbacks for each type of notifications
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = OnRedirectToIdentityProvider,
AuthorizationCodeReceived = OnAuthorizationCodeReceived,
AuthenticationFailed = OnAuthenticationFailed,
},
// Specify the claims to validate
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name"
},
// Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
Scope = $"openid profile offline_access {ReadTasksScope} {WriteTasksScope}"
}
);
}
Azure AD B2C n'inclut pas encore de revendications de groupe dans le jeton qu'il envoie à l'application , vous ne pouvez donc pas suivre la même approche que celle décrite avec Azure AD (qui inclut les revendications de groupe dans le jeton).
Vous pouvez prendre en charge cette fonctionnalité en la votant dans le forum de commentaires Azure AD B2C: Obtenez les groupes d'appartenance des utilisateurs dans les revendications avec Azure AD B2C
Cela étant dit, vous pouvez faire un travail supplémentaire dans cette application pour qu'elle récupère manuellement ces revendications du groupe et les injecte dans le jeton .
Tout d'abord, enregistrez une application distincte qui appellera Microsoft Graph pour récupérer les revendications de groupe .
https://yourtenant.onmicrosoft.com/groups
)https://login.microsoftonline.com/YOUR_TENANT.onmicrosoft.com/adminconsent?client_id=YOUR_CLIENT_ID&state=12345&redirect_uri=YOUR_REDIRECT_URI
Ensuite, vous devrez ajouter le code suivant dans le gestionnaire OnAuthorizationCodeReceived
, juste après avoir utilisé le code :
var authority = $"https://login.microsoftonline.com/{Tenant}";
var graphCca = new ConfidentialClientApplication(GraphClientId, authority, GraphRedirectUri, new ClientCredential(GraphClientSecret), userTokenCache, null);
string[] scopes = new string[] { "https://graph.Microsoft.com/.default" };
try
{
AuthenticationResult authenticationResult = await graphCca.AcquireTokenForClientAsync(scopes);
string token = authenticationResult.AccessToken;
using (var client = new HttpClient())
{
string requestUrl = $"https://graph.Microsoft.com/v1.0/users/{signedInUserID}/memberOf?$select=displayName";
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response = await client.SendAsync(request);
var responseString = await response.Content.ReadAsStringAsync();
var json = JObject.Parse(responseString);
foreach (var group in json["value"])
notification.AuthenticationTicket.Identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, group["displayName"].ToString(), System.Security.Claims.ClaimValueTypes.String, "Graph"));
//TODO: Handle paging.
// https://developer.Microsoft.com/en-us/graph/docs/concepts/paging
// If the user is a member of more than 100 groups,
// you'll need to retrieve the next page of results.
}
} catch (Exception ex)
{
//TODO: Handle
throw;
}