2017-08-29 2 views
0

J'obtiens un access_token et un id_token d'AzureAD pour mon application, qui utilise OAuth2 avec le flux implicite. Ceci est un exemple d'URL où j'obtenir les jetons:Asp.Net - Authentification au porteur Jwt: Signature non valide

https://login.microsoftonline.com/my_tenant_id/oauth2/v2.0/authorize?response_type=id_token+token&client_id=my_client_id&state=some_state&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fsign-in&scope=openid%20https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&nonce=some_nonce

Le champ d'application est openid https://grap.microsoft.com/user.read.

Le type de réponse est id_token+token.

J'ai aussi un backend Asp.Net, je veux sécuriser. J'utilise donc l'attribut Authorize pour mon contrôleur et envoie un jeton dans l'en-tête comme ceci: "Authentification: Porteur THE_TOKEN".

Ma configuration Startup.cs ressemble à ceci:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    Authority = string.Format("https://login.microsoftonline.com/{0}/v2.0/", 
      "d67853c3-db96-4dac-a37b-f2bfb12b42d1"), 
    Audience = "8422b3fb-5612-4fdd-a90f-707d7218de57" 
}); 

D'après ce que j'ai lu, le jeton d'accès doit être utilisé pour cela, et le id_token ne doit pas quitter le frontend. Mais l'authentification dans le backend ne fonctionne qu'avec le jeton d'identification dans mon cas. Le paramètre access_token ne peut pas être signé Bearer error="invalid_token", error_description="The signature is invalid".

En regardant le access_token dans jwt.io, je vois que les jetons ont des audiences et des émetteurs différents. Le access_token par exemple a ce

"aud": "https://graph.microsoft.com", 
"iss": "https://sts.windows.net/d67853c3-db96-4dac-a37b-f2bfb12b42d1/", 

alors que le jeton d'identification a ce

"aud": "my_client_id", 
"iss": "https://login.microsoftonline.com/my_tenant_id/v2.0", 

Il me semble, la access_token a été en quelque sorte délivré pour l'API graphique. Serait heureux si quelqu'un pouvait me dire, ce que je fais mal ou comment je peux essayer de résoudre mes problèmes.

modifier: Il fonctionnait comme prévu auparavant lorsque j'ai utilisé la portée openid profile. Mais en raison de changements dans Azure, cette portée n'est plus valide et Microsoft m'a demandé d'utiliser la portée mentionnée ci-dessus.

Répondre

1

Comme vous l'avez mentionné, le jeton d'accès que vous avez demandé est pour Microsoft Graph. Et le id_token est seulement pour le client d'authentifier l'utilisateur au lieu de pour le serveur de ressources.

Pour protéger l'API Web en utilisant le Azure point final V2.0 AD, nous pouvons acquérir le jeton d'accès pour l'API Web comme demande ci-dessous:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=token&client_id={client_id}&scope=api://{client_id}/access_as_user&redirect_uri={redirect_uri} 

Et est le code ici en utilisant la protection de l'API Web via Azure point final V2.0 AD:

public void ConfigureAuth(IAppBuilder app) 
{ 
    System.Diagnostics.Trace.TraceWarning("Hello"); 
    var tvps = new TokenValidationParameters 
    { 
     // The web app and the service are sharing the same clientId 
     ValidAudience = clientId, 
     ValidateIssuer = false, 
    }; 

    // NOTE: The usual WindowsAzureActiveDirectoryBearerAuthenticaitonMiddleware uses a 
    // metadata endpoint which is not supported by the v2.0 endpoint. Instead, this 
    // OpenIdConenctCachingSecurityTokenProvider can be used to fetch & use the OpenIdConnect 
    // metadata document. 

    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions 
    { 
     AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider("https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration")), 
    }); 
} 

}

Plus de détails sur la protection de l'API Web via Azure AD point final V2.0, vous pouvez consulter le document ci-dessous:

Calling a web API from a .NET web app

+0

Merci! En attendant, je suis allé avec AD V1.0 et cela a bien fonctionné, car là, je pourrais spécifier une ressource. Je l'ai donc maintenant en train de me réveiller, mais je testerai aussi votre solution quand j'en aurai le temps. – Hinrich