我有一個應用程序(當前處於UWP),它使用MobileServiceClient和AutoRest來訪問Azure應用程序服務API應用程序。我成功地使用了winfbsdk,並且可以通過它進行身份驗證,然後使用FB訪問令牌作爲JObject登錄到MobileService.LoginAsync。在應用程序中通過AutoRest調用API應用程序時,我還會將該JObject發送到x-zumo-auth頭文件中。 我想要做的是能夠使用MicrosoftAccount進行身份驗證。如果我使用MobileService.LoginAsync,我無法獲得正確的令牌並將其傳遞給AutoRest--它總是以401未授權的形式返回。 我試圖使用MSAL,但它返回一個持票人令牌並傳遞一起也回來作爲401未經授權。 有沒有什麼好的方法可以做到這一點?我開始使用MSAL的路線,因爲它支持Windows桌面,UWP和Xamarin表單,這將是理想的選擇。我只需要了解如何從它獲取適當的令牌傳遞給返回到Azure App Service API應用程序的AutoRest HttpClient。MSAL,Azure MobileService和Auto REST調用獲取401未授權
更新: 如果我用下面的流程,它的工作原理與Facebook,但不是MicrosoftAccount。
(通過瀏覽器和招搖用於測試)
-Azure AppService服務用的WebAPI
- 安全設置通過天青儀表板上的服務,並且被配置爲允許Facebook或MicrosoftAccount
1.在我的UWP的應用程序,使用winfbsdk ,我登錄與Facebook,然後抓住FBSession.AccessTokenData.AccessToken,並插入到一個JObject:
JObject token = JObject.FromObject
(new{access_token = fbSession.AccessTokenData.AccessToken});
2.登錄MobileServiceClient
user = await App.MobileService.LoginAsync
(MobileServiceAuthenticationProvider.Facebook, token);
登錄到應用程序API與HttpClient的和檢索令牌中使用的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呼叫只是將執行以下操作:
if (this.HttpClient.DefaultRequestHeaders.Contains("x-zumo-auth") == true) { this.HttpClient.DefaultRequestHeaders.Remove("x-zumo-auth"); } this.HttpClient.DefaultRequestHeaders.Add("x-zumo-auth", applicationToken);
使用ApiAppClient(使用Azure AppService WebAPI的swagger json中的AutoRest創建的)的任何後續調用都包含x-zumo-auth頭並且經過了適當的身份驗證。
嘗試使用MicrosoftAccount時會發生此問題。我似乎無法從MSAL或LoginWithMicrosoftAsync獲取適當的令牌以用於x-zumo-auth。
對於上面#1,試圖爲MicrosoftAccount時,我用MSAL如下:AuthenticationResult result = await MSAuthentication_AcquireToken(); JObject token = JObject.FromObject(new{access_token = result.Token});
而MSAuthentication_AcquireToken定義如下,使用接口和類作爲建議天青樣品中: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;
}
}
更新 - 確定與MobileServiceClient,但仍無法正常工作的智慧^ h MSAL
我得到了它與MobileServiceClient工作如下:
1.使用MobileService.LoginAsync
2.將返回User.MobileServiceAuthenticationToken
3.設置X-謨-AUTH頭包含User.MobileServiceAuthenticationToken
user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);
applicationToken = user.MobileServiceAuthenticationToken;
ApiAppClient.UpdateAppAuthenticationToken(applicationToken);
MSAL仍然沒有工作!
所以原來的問題仍然存在,從MSAL返回的令牌的哪一部分是否需要傳遞給X-ZUMO-AUTH或其他頭文件,以便對Azure AppService WebAPI應用程序的調用進行身份驗證?
當我使用Facebook的身份驗證提供這一切工作正常,在我原來的職位。但是,從MSAL返回的「承載」令牌(AuthenticationResult.Token)並將其插入X-ZUMO-AUTH以進行API APP調用時,它不起作用。它仍然獲得未經授權。 – GouldComputing
另外,如果我用MobileServiceClient.LoginAsync或LoginWithMicrosoftAccountAsync並採取MobileServiceUser.MobileServiceAuthenticationToken和使用,在X-謨-AUTH它得到未經授權。 – GouldComputing
如果我接收有效的MobileServiceClient.Login,然後使用InvokeApiAsync並點擊/.auth/me端點,則會在內容響應中收到包含「access_token」的響應。但是如果我在X-ZUMO-AUTH中使用access_token,它仍然會返回未授權 – GouldComputing