2017-03-28 2 views
1

J'ai couru le Pour le compte de l'échantillon dans 4,5 .NET:Comment faire au nom d'auth dans .NET Core (BootstrapContext manquant)?

https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

Mais je dois faire la même chose dans le noyau .NET. Lorsque vous essayez de port de service exemple à .NET tout coeur pour cette compile, sauf la ligne:

var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext; 

Il ne compilera pas parce que System.IdentityModel n'est pas disponible dans .NET de base.

J'ai découvert que si j'acquiers l'accès utilisateur jeton et le nom d'utilisateur en utilisant ce code à la place qu'il fonctionne pour les utilisateurs dans le même locataire que le service:

System.Security.Claims.ClaimsIdentity identity = 
    User.Identity as System.Security.Claims.ClaimsIdentity; 
string userAccessToken = identity.BootstrapContext as string; 
string userName = (User.FindFirst(ClaimTypes.Upn))?.Value; 

Mais pour les utilisateurs dans un différent locataire (authentification multi-locataire), userAccessToken et userName sont définis sur null. Que dois-je faire différemment pour que cela fonctionne pour les utilisateurs provenant d'un autre locataire?

Répondre

1

je me suis dit que la raison userAccessToken et userName étaient revenir comme nulle est parce que je manque le paramètre SaveSigninToken lorsque vous appelez UseJwtBearerAuthentication dans Startup.cs:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    Authority = String.Format(CultureInfo.InvariantCulture, Configuration["Authentication:AzureAd:AADInstance"], Configuration["Authentication:AzureAd:Tenant"]), 
    Audience = Configuration["Authentication:AzureAd:Audience"], 
      TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true, ValidateIssuer = false } 
}); 

Sans SaveSigninToken = true, l'accès de l'appelant jeton et l'identité ne circule pas dans le cas où l'appelant provient d'un autre locataire.

0

Au lieu d'utiliser la classe BootstrapContext pour obtenir le access_token, nous pouvons utiliser le HttpContext dans le contrôleur directement pour obtenir le access_token Orignal via le code ci-dessous:

var orignalToken = HttpContext.Request.Headers["authorization"][0].Split(' ')[1]; 
+0

Bonne alternative. Merci. –