2017-04-18 4 views
-1

Ich habe eine App (derzeit in UWP), die MobileServiceClient und AutoRest für eine Azure App Service API-App verwendet. Ich habe das winfbsdk erfolgreich verwendet und kann mich dadurch authentifizieren und es dann dazu bringen, sich bei MobileService.LoginAsync mit dem FB-Zugriffstoken als JObject anzumelden. Ich nehme dieses JObject auch und sende es in der x-zumo-auth-Kopfzeile, wenn ich innerhalb der App über AutoRest Aufrufe an die API-App mache. Was ich tun möchte, ist in der Lage, mit MicrosoftAccount zu authentifizieren. Wenn ich MobileService.LoginAsync verwende, kann ich das richtige Token nicht abrufen und es an AutoRest weiterleiten - es kommt immer als 401 Unauthorized zurück. Ich habe versucht, MSAL zu verwenden, aber es gibt ein Bearer-Token zurück, und das wird auch als 401 Unauthorized zurückgegeben. Gibt es einen guten Weg, dies zu tun? Ich begann auf der Route von MSAL, da dies Windows Desktop, UWP und Xamarin Forms unterstützen würde, die ideal sind. Ich brauche nur Informationen darüber, wie man das richtige Token von diesem zu einem AutoRest HttpClient bekommt, der zurück zur Azure App Service API App geht.MSAL-, Azure MobileService- und Auto REST-Aufrufe erhalten 401 Nicht autorisiert

Update: Wenn ich den folgenden Fluss verwenden, es funktioniert mit Facebook, aber nicht mit Microsoft-Konto.

-Azure AppService mit WebAPI (swagger und für das Testen über einen Browser)
-Sicherheit Setup durch den Azure Armaturenbrett auf den Dienst und konfiguriert Face oder Microsoft-Konto

1. Auf dem UWP app unter Verwendung winfbsdk ermöglichen ich melde mich mit Facebook, dann die FBSession.AccessTokenData.AccessToken greifen und in eine JObject einfügen:

JObject token = JObject.FromObject 
    (new{access_token = fbSession.AccessTokenData.AccessToken}); 

2. Login MobileServiceClient

user = await App.MobileService.LoginAsync 
    (MobileServiceAuthenticationProvider.Facebook, token); 
  1. Login API App mit Httpclient und die Token abrufen in X-ZUMO-AUTH

    using (var client = new HttpClient()) 
    { 
        client.BaseAddress = App.MobileService.MobileAppUri; 
         var jsonToPost = token; 
    
         var contentToPost = new StringContent(
         JsonConvert.SerializeObject(jsonToPost), 
         Encoding.UTF8, "application/json"); 
         var asyncResult = await client.PostAsync(
         "/.auth/login/" + provider.ToString(), 
         contentToPost); 
    
         if (asyncResult.Content == null) 
         { 
          throw new InvalidOperationException("Result from call was null."); 
          return false; 
         } 
         else 
         { 
          if (asyncResult.StatusCode == System.Net.HttpStatusCode.OK) 
          { 
           var resultContentAsString = asyncResult.Content.AsString(); 
    
           var converter = new ExpandoObjectConverter(); 
           dynamic responseContentAsObject = JsonConvert.DeserializeObject<ExpandoObject>(
           resultContentAsString, converter); 
    
           var applicationToken = responseContentAsObject.authenticationToken; 
    
           ApiAppClient.UpdateXZUMOAUTHToken(applicationToken); 
          } 
         } 
        } 
    
  2. ApiAppClient.UpdateXZUMOAUTH Anruf nur zu verwenden, führt folgende Aktionen :

    if (this.HttpClient.DefaultRequestHeaders.Contains("x-zumo-auth") == true) 
        { 
         this.HttpClient.DefaultRequestHeaders.Remove("x-zumo-auth"); 
        } 
    
        this.HttpClient.DefaultRequestHeaders.Add("x-zumo-auth", applicationToken); 
    


  3. Alle nachfolgenden Aufrufe, die den ApiAppClient (erstellt mit AutoRest aus dem Swagger-Json meiner Azure AppService-WebAPI) verwenden, enthalten den Header x-zumo-auth und sind ordnungsgemäß authentifiziert.

    Das Problem tritt auf, wenn Sie versuchen, MicrosoftAccount zu verwenden. Ich kann nicht scheinen, das richtige Token zu erhalten, um in x-zumo-auth entweder von MSAL oder von LoginWithMicrosoftAsync zu verwenden.

    Für 1 # oben, wenn für Microsoft-Konto versucht, verwendete ich MSAL wie folgt:

    AuthenticationResult result = await MSAuthentication_AcquireToken(); 
    JObject token = JObject.FromObject(new{access_token = result.Token}); 
    


Und MSAuthentication_AcquireToken ist nachstehend definiert, mit Hilfe von Schnittstellen und Klassen, wie in den Azure Proben vorgeschlagen: https://github.com/Azure-Samples/active-directory-xamarin-native-v2

 private async Task<AuthenticationResult> MSAuthentication_AcquireToken() 
     { 
     IMSAcquireToken at = new MSAcquireToken(); 
     try 
     { 
      AuthenticationResult res; 
      res = await at.AcquireTokenAsync(App.MsalPublicClient, App.Scopes); 

      return res; 
     } 
     } 

Update - ok mit MobileServiceClient, aber immer noch nicht wit h MSAL
Ich habe es mit MobileServiceClient Arbeits wie folgt:
1. Verwenden Sie MobileService.LoginAsync
2. Nehmen Sie die zurück User.MobileServiceAuthenticationToken
3. Stellen Sie den X-ZUMO-AUTH-Header die User.MobileServiceAuthenticationToken enthalten

user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount); 
applicationToken = user.MobileServiceAuthenticationToken; 
ApiAppClient.UpdateAppAuthenticationToken(applicationToken); 


MSAL arbeiten immer noch nicht!
Also bleibt die ursprüngliche Frage, welcher Teil des von MSAL zurückgegebenen Tokens müssen wir an X-ZUMO-AUTH oder einen anderen Header weitergeben, damit sich die Aufrufe an die Azure AppService WebAPI-App authentifizieren?

Antwort

0

Ich habe eine App (derzeit in UWP), die MobileServiceClient und AutoRest zu einer Azure App Service API App verwendet. Ich habe das winfbsdk erfolgreich verwendet und kann mich dadurch authentifizieren und es dann dazu bringen, sich bei MobileService.LoginAsync mit dem FB-Zugriffstoken als JObject anzumelden. Ich nehme dieses JObject auch und sende es in der x-zumo-auth-Kopfzeile, wenn ich innerhalb der App über AutoRest Aufrufe an die API-App mache.

Entsprechend Ihrer Beschreibung nahm ich an, dass Sie Client-managed authentication verwenden. Sie bitte direkt Kontakt mit dem Identity-Provider und dann das Token mit deinem Handy um Back-End bei der Anmeldung zur Verfügung stellen, dann könnten Sie MobileServiceClient.InvokeApiAsync nutzen Sie Ihre API APP zu nennen, die den X-ZUMO-AUTH Header mit dem Wert hinzufügen würde authenticationToken nachdem Sie MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);

aufrufen

Was ich tun möchte, ist in der Lage, mit MicrosoftAccount authentifizieren. Wenn ich MobileService.LoginAsync verwende, kann ich das richtige Token nicht abrufen und es an AutoRest weiterleiten - es kommt immer als 401 Unauthorized zurück. Ich habe versucht, MSAL zu verwenden, aber es gibt ein Bearer-Token zurück und es wird als 401 Unauthorized zurückgegeben. Gibt es einen guten Weg, dies zu tun?

AFAIK, für das Client-Flow-Authentifizierungsmuster (AAD, Facebook, Google), die token Parameter für LoginAsync wie {"access_token":"{the_access_token}"} aussehen würden.

Für die Client-Flow-Authentifizierung (Microsoft-Konto), könnten Sie MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}") nutzen, auch Sie können LoginAsync mit dem token Parameter des Wertes {"access_token":"{the_access_token}"} oder {"authenticationToken":"{Live-SDK-session-authentication-token}"} verwenden.Ich habe LoginAsync mit dem access_token von MSA getestet und protokolliert Informationen abrufen wie folgt:

enter image description here

Zusammengefasst, wenn Sie die authentionToken abrufen, nachdem Sie mit Ihrem mobilen Back-End angemeldet haben, können Sie die X-ZUMO-AUTH hinzufügen Header zu jeder Ihrer API APP-Anfragen mit der authentionToken.

enter image description here

Weitere Informationen Sie zu diesem offiziellen Dokument über authentication works in App Service beziehen könnten.

UPDATE

Ich habe diese https://github.com/Azure-Samples/active-directory-xamarin-native-v2 geprüft und verwendet fiddler die Netzwerkpakete zu erfassen, wenn der Benutzer authentifiziert und ein Zugriffstoken zu erhalten. Ich habe festgestellt, dass MSAL gegen Microsoft Graph and REST arbeitet und wenn der Benutzer angemeldet ist, konnten Sie nur die access_token und id_token abrufen, und beide konnten nicht für Single Sign-On mit Ihrem mobilen Back-End verwendet werden. Das offizielle Codebeispiel zur Client-verwalteten Authentifizierung für Azure Mobile Apps mit MSA verwendet Live SDK. Als Live SDK REST API erwähnt über signing users, können Sie einen Zugriffstoken und einen Authentifizierungstoken erhalten, der für Single-Sign-On-Szenario verwendet wird. Außerdem habe ich die Server-managed authentication überprüft und festgestellt, dass App-Service-Authentifizierung/Autorisierung für MSA auch die Live SDK REST API verwendet. Zusammenfassend können Sie MSAL nicht für die clientgesteuerte Authentifizierung mit MSA verwenden. Für die clientverwaltete Authentifizierung müssen Sie Live SDK verwenden, um die authentication_token abzurufen und dann MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}") aufzurufen, um die authenticationToken von Ihrem mobilen Back-End abzurufen. Oder Sie könnten einfach die serververwaltete Authentifizierung für MSA nutzen. Weitere Informationen zu Live SDK finden Sie unter LiveSDK.

+0

All dies funktioniert gut wie in meinem ursprünglichen Beitrag, wenn ich Facebook als Authentifizierungsanbieter verwende. Es funktioniert jedoch nicht, wenn Sie das "Bearer" -Token (AuthenticationResult.Token) nehmen, das von MSAL zurückkommt, und dieses für die API-APP-Aufrufe in X-ZUMO-AUTH einfügen. Es wird immer noch nicht autorisiert. – GouldComputing

+0

Wenn ich MobileServiceClient.LoginAsync oder LoginWithMicrosoftAccountAsync verwende und den MobileServiceUser.MobileServiceAuthenticationToken nehme und diesen in X-ZUMO-AUTH verwende, wird er nicht autorisiert. – GouldComputing

+0

Und wenn ich das gültige MobileServiceClient.Login nehme und dann InvokeApiAsync benutze und den /.auth/me Endpunkt triff, erhalte ich eine Antwort, die "access_token" in der Inhaltsantwort enthält. Aber wenn ich dieses access_token in X-ZUMO-AUTH benutze, kommt es immer noch zurück. Unauthorized – GouldComputing

Verwandte Themen