2016-07-12 13 views
2

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 „

Antwort

1

ich es geschafft, die Zugriffstoken tike zu erhalten:

public static async Task<Task> SecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context) 
    { 
     string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 
     string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; 
     string clientSecret = ConfigurationManager.AppSettings["ida:ClientSecret"]; 
     string source = ConfigurationManager.AppSettings["ExchangeOnlineId"]; 

     var authContext = new AuthenticationContext(aadInstance, false); 
     var credentials = new ClientCredential(clientId, clientSecret); 
     var appRedirectUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + "/"; 
     var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(context.ProtocolMessage.Code, new Uri(appRedirectUrl), credentials, source); 
     var accessToken = authResult.AccessToken; 
     var applicationUserIdentity = new ClaimsIdentity(context.OwinContext.Authentication.User.Identity); 
     applicationUserIdentity.AddClaim(new Claim("AccessToken", accessToken)); 
     context.OwinContext.Authentication.User.AddIdentity(applicationUserIdentity); 
     return Task.FromResult(0); 
    } 

Zunächst ich eine ClientAssertion verwenden wollte, so habe ich nicht die clie aussetzen nt Secret, aber es ist zu viel Arbeit, das Zertifikat zu verwalten ...

3

Die Anwendung hängt, weil Ihr auf dem Ergebnis eines Asynchron taskby Blockierung der .RESULT von authResult Zugriff

Sie das ändern sollte..

public static async 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.AccessToken; 
    context.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", accessToken)); 
} 
+0

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 ... –

+0

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? :( –