Ich versuche, das Zugriffstoken abzurufen, damit ich es speichern und später an einen ExchangeService übergeben kann. Startup.Auth sieht wie folgt aus:Get Access-Token in MVC-Anwendung
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
UseTokenLifetime = false,
/*
* Skipping the Home Realm Discovery Page in Azure AD
* http://www.cloudidentity.com/blog/2014/11/17/skipping-the-home-realm-discovery-page-in-azure-ad/
*/
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = OpenIdConnectNotification.RedirectToIdentityProvider,
MessageReceived = OpenIdConnectNotification.MessageReceived,
SecurityTokenReceived = OpenIdConnectNotification.SecurityTokenReceived,
SecurityTokenValidated = OpenIdConnectNotification.SecurityTokenValidated,
AuthorizationCodeReceived = OpenIdConnectNotification.AuthorizationCodeReceived,
AuthenticationFailed = OpenIdConnectNotification.AuthenticationFailed
},
});
dann in SecurityTokenValidated Ich tat dies:
public static async Task<Task> SecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
{
string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
var authContext = new AuthenticationContext(aadInstance + "/oauth2/token", false);
var authResult =await authContext.AcquireTokenByAuthorizationCodeAsync(context.ProtocolMessage.Code,
new Uri(aadInstance), new ClientAssertion(clientId, "5a95f1c6be7bf3c61f6392ec84ddd044acef61d9"));
var accessToken = authResult.Result.AccessToken;
context.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", accessToken));
return Task.FromResult(0);
}
Ich bekomme keine Fehler, aber die Anwendung hängt an dieser Zeile:
var accessToken = authResult.Result.AccessToken;
Die ClientAssertion wurde mit einem Fingerabdruck eines SSL-Zertifikats erstellt, das ich in IIS installiert habe, nicht sicher, ob das Zertifikat den falschen Typ hat ...
UPDATE: Ich habe das SecurityTokenValidated aktualisiert, um Sacas Kommentar zu reflektieren, aber ich bekomme ein "AADSTS50027: Invalid JWT Token. Token-Format ungültig „Fehler auf diese Weise Ich habe auch versucht, diesen Code:
string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
var authContext = new AuthenticationContext(aadInstance, false);
var cert = new X509Certificate2("...", "...");
var cacert = new ClientAssertionCertificate(clientId, cert);
var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(context.ProtocolMessage.Code, new Uri(aadInstance), cacert);
var accessToken = authResult.AccessToken;
context.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", accessToken));
return Task.FromResult(0);
aber auf diese Weise erhalte ich“ AADSTS70002: Fehler Anmeldeinformationen zu validieren. AADSTS50012: Client Behauptung enthält eine ungültige Signatur „
Dies behob den hängenden Teil, aber ich habe immer noch nicht das access_token. Die App lädt, und dann, wenn ich versuche, auf das Token zuzugreifen, ist der Anspruch nicht da ... –
Hmm ... Ich denke Chrome hat ein paar Sachen zwischengespeichert, weil ich versucht habe, im IE zu testen und ich habe eine schlechte Anfrage bekommen, was das erklärt fehlendes Token. Die Frage ist nun, wie finde ich heraus, was auf meine Anfrage schlecht ist? :( –