-1

我有一个将 MobileServiceClient 和 AutoRest 用于 Azure App Service API App 的应用程序(目前在 UWP 中)。我成功使用了 winfbsdk 并且可以通过它进行身份验证,然后使用 FB 访问令牌作为 JObject 登录到 MobileService.LoginAsync。当通过应用程序内的 AutoRest 调用 API 应用程序时,我还会使用该 JObject 并将其发送到 x-zumo-auth 标头中。我想做的是能够使用 MicrosoftAccount 进行身份验证。如果我使用 MobileService.LoginAsync,我无法获得正确的令牌并将其传递给 AutoRest - 它总是以 401 Unauthorized 的形式返回。我尝试使用 MSAL,但它返回一个 Bearer 令牌,并且传递它也会返回 401 Unauthorized。有什么好的方法可以做到这一点吗?我开始走 MSAL 路线,因为那会支持 Windows 桌面,UWP 和 Xamarin Forms 这将是理想的。我只需要有关如何从中获取正确令牌以传递给 AutoRest HttpClient 的信息,该 AutoRest HttpClient 会返回到 Azure App Service API App。

更新: 如果我使用以下流程,它适用于 Facebook,但不适用于 MicrosoftAccount。

-带有WebAPI的Azure AppService(并通过浏览器进行测试)
-通过服务上的Azure仪表板进行安全设置并配置为允许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);
  1. 使用 HttpClient 登录 API 应用程序并检索要在 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 调用仅执行以下操作:

        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. 任何使用 ApiAppClient 的后续调用(使用 AutoRest 从我的 Azure AppService WebAPI 的 swagger json 创建)都包含 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 定义如下,使用 Azure 示例中建议的接口和类: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,但仍然无法使用 MSAL
我让它与 MobileServiceClient 一起使用如下:
1. 使用 MobileService.LoginAsync
2. 获取返回的 User.MobileServiceAuthenticationToken
3. 设置 X-ZUMO-AUTH 标头以包含用户。 MobileServiceAuthenticationToken

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


MSAL 仍然无法正常工作!
所以最初的问题仍然存在,我们需要将从 MSAL 返回的令牌的哪一部分传递给 X-ZUMO-AUTH 或其他标头,以便对 Azure AppService WebAPI 应用程序的调用进行身份验证?

4

1 回答 1

0

我有一个将 MobileServiceClient 和 AutoRest 用于 Azure App Service API App 的应用程序(目前在 UWP 中)。我成功使用了 winfbsdk 并且可以通过它进行身份验证,然后使用 FB 访问令牌作为 JObject 登录到 MobileService.LoginAsync。当通过应用程序内的 AutoRest 调用 API 应用程序时,我还会使用该 JObject 并将其发送到 x-zumo-auth 标头中。

根据您的描述,我假设您正在使用Client-managed authentication。您直接联系身份提供者,然后在登录期间使用您的移动后端提供令牌,然后您可以利用MobileServiceClient.InvokeApiAsync调用您的 API APP,它会在您调用后添加X-ZUMO-AUTH带有值的标头authenticationTokenMobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);

我想做的是能够使用 MicrosoftAccount 进行身份验证。如果我使用 MobileService.LoginAsync,我无法获得正确的令牌并将其传递给 AutoRest - 它总是以 401 Unauthorized 的形式返回。我尝试使用 MSAL,但它返回一个 Bearer 令牌,并且传递它也会返回 401 Unauthorized。有什么好的方法可以做到这一点吗?

AFAIK,对于客户端流身份验证模式(AAD、Facebook、Google)token参数 forLoginAsync看起来像{"access_token":"{the_access_token}"}.

对于客户端流身份验证(Microsoft 帐户),您可以利用MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}"),也可以LoginAsynctokenvalue{"access_token":"{the_access_token}"}或的参数一起使用{"authenticationToken":"{Live-SDK-session-authentication-token}"}。我已经LoginAsync使用access_token来自 MSA 的测试并检索记录的信息,如下所示:

在此处输入图像描述

总之,当您使用authentionToken移动后端登录后检索.X-ZUMO-AUTHauthentionToken

在此处输入图像描述

更多详细信息,您可以参考此官方文档,了解App Service 中的身份验证工作

更新

我已经检查了这个https://github.com/Azure-Samples/active-directory-xamarin-native-v2并在验证用户并获取访问令牌时使用fiddler捕获网络包。我发现 MSAL 正在针对Microsoft Graph 和 REST工作,当用户登录时,您只能检索access_tokenand id_token,并且它们都不能用于您的移动后端的单点登录。

虽然有关使用 MSA 的 Azure 移动应用的客户端管理身份验证的官方代码示例使用的是Live SDK。正如Live SDK REST API关于签署用户所提到的,您可以获得用于单点登录场景的访问令牌身份验证令牌。此外,我检查了服务器管理的身份验证,发现 MSA 的应用服务身份验证/授权也使用 Live SDK REST API。总之,您不能将 MSAL 用于使用 MSA 进行客户端管理的身份验证,对于客户端管理的身份验证,您需要利用 Live SDK 来检索authentication_tokenthen 调用MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}")来检索authenticationToken从您的移动后端。或者,您可以只为 MSA 使用服务器管理的身份验证。有关 Live SDK 的更多详细信息,您可以参考LiveSDK

于 2017-04-18T10:34:11.473 回答