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);
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); } } }
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);
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?
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
Wenn ich MobileServiceClient.LoginAsync oder LoginWithMicrosoftAccountAsync verwende und den MobileServiceUser.MobileServiceAuthenticationToken nehme und diesen in X-ZUMO-AUTH verwende, wird er nicht autorisiert. – GouldComputing
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