2017-04-18 72 views
-1

我有一個應用程序(當前處於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應用程序的調用進行身份驗證?

    回答

    0

    我有一個應用程序(目前在UWP),使用MobileServiceClient和AutoRest到Azure應用程序服務API應用程序。我成功地使用了winfbsdk,並且可以通過它進行身份驗證,然後使用FB訪問令牌作爲JObject登錄到MobileService.LoginAsync。在應用程序中通過AutoRest調用API應用程序時,我還會將該JObject發送到x-zumo-auth頭文件中。

    根據您的描述,我認爲您使用的是Client-managed authentication。您可以直接聯繫身份提供者,然後用您的手機後臺登錄,那麼你可以利用MobileServiceClient.InvokeApiAsync打電話給你的API應用程序,它會與價值authenticationToken添加X-ZUMO-AUTH頭中提供的令牌調用MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);

    我想要做的是能夠使用MicrosoftAccount進行身份驗證。如果我使用MobileService.LoginAsync,我無法獲得正確的令牌並將其傳遞給AutoRest--它總是以401未授權的形式返回。我試圖使用MSAL,但它返回一個持票人令牌並將其傳遞給401 Unauthorized。有沒有什麼好方法可以做到這一點?

    據我所知,,對客戶端流量認證模式(AAD,Facebook,谷歌),則token參數LoginAsync會是什麼樣子{"access_token":"{the_access_token}"}

    ,對客戶端流量的認證(微軟賬戶),你可以利用MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}"),也可以使用LoginAsync與價值{"access_token":"{the_access_token}"}{"authenticationToken":"{Live-SDK-session-authentication-token}"}token參數。我從MSA測試LoginAsyncaccess_token和檢索記錄的信息如下:

    enter image description here

    總之,當你檢索authentionToken您登錄與您的移動後端後,您可以添加X-ZUMO-AUTH頭部添加到您的每個API APP請求authentionToken

    enter image description here

    有關詳細信息,你可以參考這個官方文件關於authentication works in App Service

    UPDATE

    我已經檢查這個https://github.com/Azure-Samples/active-directory-xamarin-native-v2和使用fiddler驗證用戶時捕獲網絡數據包,並得到一個訪問令牌。我發現,社會事務和勞工部正在對Microsoft Graph and REST當用戶登錄,您只能檢索access_tokenid_token,二者均不能使用單點登錄與您的移動後端。

    雖然關於Azure的移動應用與MSA客戶端管理認證的官方代碼示例使用Live SDK。正如Live SDK REST API提到的大約signing users,您可以獲得訪問令牌身份驗證令牌,它用於單點登錄方案。另外,我檢查了Server-managed authentication,發現MSA的應用服務認證/授權也使用Live SDK REST API。 總之,你不能對客戶管理的認證與MSA使用MSAL,爲客戶管理的認證,你需要利用直播SDK檢索authentication_token然後調用MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}")從行動後端檢索authenticationToken。或者您可以利用MSA的服務器管理的身份驗證。有關Live SDK的更多詳細信息,請參閱LiveSDK

    +0

    當我使用Facebook的身份驗證提供這一切工作正常,在我原來的職位。但是,從MSAL返回的「承載」令牌(AuthenticationResult.Token)並將其插入X-ZUMO-AUTH以進行API APP調用時,它不起作用。它仍然獲得未經授權。 – GouldComputing

    +0

    另外,如果我用MobileServiceClient.LoginAsync或LoginWithMicrosoftAccountAsync並採取MobileServiceUser.MobileServiceAuthenticationToken和使用,在X-謨-AUTH它得到未經授權。 – GouldComputing

    +0

    如果我接收有效的MobileServiceClient.Login,然後使用InvokeApiAsync並點擊/.auth/me端點,則會在內容響應中收到包含「access_token」的響應。但是如果我在X-ZUMO-AUTH中使用access_token,它仍然會返回未授權 – GouldComputing