我有一个将 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);
使用 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); } } }
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 的后续调用(使用 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 应用程序的调用进行身份验证?