2017-08-29 2 views
0

Ich erhalte ein Access_Token und ID_Token von AzureAD für meine App, die OAuth2 mit dem impliziten Flow verwendet. Dies ist ein Beispiel-URL, wo ich die Token erhalten:Asp.Net - JWT Bearer Authentifizierung: Ungültige Signatur

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

Der Umfang ist openid https://grap.microsoft.com/user.read.

Der Antworttyp ist id_token+token.

Ich habe auch ein Asp.Net-Backend, das ich sichern möchte. Also verwende ich das Authorize Attribut für meinen Controller und sende ein Token in der Kopfzeile wie folgt: "Authentication: Bearer THE_TOKEN".

Meine Konfiguration in Startup.cs sieht wie folgt aus:

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" 
}); 

Von dem, was ich gelesen habe, sollte das Zugriffstoken für diese verwendet werden, und die id_token das Frontend nicht verlassen sollte. Aber die Authentifizierung im Backend funktioniert in meinem Fall nur mit dem ID-Token. Das access_token kann nicht signiert werden Bearer error="invalid_token", error_description="The signature is invalid".

Mit Blick auf das access_token in jwt.io sehe ich, dass die Token unterschiedliche Zielgruppen und Emittenten haben. Die access_token zum Beispiel hat diese

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

während die ID-Token dieses

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

So scheint es mir, wurde die access_token irgendwie für die Graph API ausgegeben. Wäre froh, wenn mir jemand sagen könnte, was ich falsch mache oder wie ich versuchen kann, meine Probleme zu lösen.

bearbeiten: Es funktionierte wie beabsichtigt, bevor ich das Oszilloskop openid profile verwendet. Aufgrund von Änderungen in Azure ist dieser Bereich jedoch nicht mehr gültig und Microsoft hat mich angewiesen, den oben genannten Bereich zu verwenden.

Antwort

1

Wie Sie bereits erwähnt haben, ist das angeforderte Zugriffstoken für Microsoft Graph. Und das id_token ist nur für den Client, um den Benutzer statt für den Ressourcenserver zu authentifizieren.

Um den Web-API mit dem Azure AD V2.0 Endpunkt zu schützen, können wir das Zugriffstoken für den Web-API wie Anfrage unten erwerben:

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} 

Und hier ist der Code, den Web-API unter Verwendung von Schutz über Azure AD V2.0 Endpunkt:

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")), 
    }); 
} 

}

Weitere Einzelheiten über den Web-API über Azure AD V2.0 Endpunkt zu schützen, können Sie das Dokument unten verweisen:

Calling a web API from a .NET web app

+0

Vielen Dank! In der Zwischenzeit ging ich mit AD V1.0 und das funktionierte gut, weil ich dort eine Ressource angeben konnte. Also ich habe es jetzt woking, aber ich werde auch deine Lösung testen, wenn ich Zeit habe. – Hinrich

Verwandte Themen