我有一个应用程序(目前在UWP中),它将MobileServiceClient和AutoRest用于Azure App Service API应用程序。我成功使用了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,这将是理想的。我只需要有关如何从中获取正确令牌以传递给返回Azure App Service API应用程序的AutoRest HttpClient的信息。
更新的
如果我使用以下流程,它适用于Facebook,但不适用于MicrosoftAccount。
-Azure AppService with WebAPI(以及通过浏览器进行测试的swagger)
- 通过服务上的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 App并检索要在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定义如下,使用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标头设置为包含User.MobileServiceAuthenticationToken
user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);
applicationToken = user.MobileServiceAuthenticationToken;
ApiAppClient.UpdateAppAuthenticationToken(applicationToken);
MSAL仍无法正常使用!
所以原始问题仍然存在,我们需要将从MSAL返回的令牌的哪一部分传递给X-ZUMO-AUTH或其他一些头,以便对Azure AppService WebAPI应用程序的调用进行身份验证?
答案 0 :(得分:0)
我有一个应用程序(目前在UWP中),它将MobileServiceClient和AutoRest用于Azure App Service API应用程序。我成功使用了winfbsdk并可以通过它进行身份验证,然后使用FB访问令牌作为JObject登录到MobileService.LoginAsync。当我在应用程序中通过AutoRest调用API应用程序时,我也会使用该JObject并将其发送到x-zumo-auth标头中。
根据您的描述,我假设您使用的是Client-managed authentication。您直接联系身份提供商,然后在登录期间使用移动后端提供令牌,然后您可以利用MobileServiceClient.InvokeApiAsync
来调用您的API APP,这将添加X-ZUMO-AUTH
标头,其值为{在您调用authenticationToken
我想要做的是能够使用MicrosoftAccount进行身份验证。如果我使用MobileService.LoginAsync,我无法获得正确的令牌并将其传递给AutoRest - 它总是以401 Unauthorized的形式返回。我试图使用MSAL,但它返回一个Bearer令牌,并且传递它也会返回401 Unauthorized。有什么好办法吗?
AFAIK,用于客户端流认证模式(AAD,Facebook,Google),MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);
的{{1}}参数看起来像token
。
对于客户端流认证(Microsoft帐户),您可以使用LoginAsync
,也可以将{"access_token":"{the_access_token}"}
与值MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}")
参数一起使用LoginAsync
或token
。我已使用MSA中的{"access_token":"{the_access_token}"}
测试了{"authenticationToken":"{Live-SDK-session-authentication-token}"}
,并按如下方式检索记录的信息:
总之,当您使用移动后端登录后检索LoginAsync
时,可以使用access_token
为每个API APP请求添加authentionToken
标头。
有关详细信息,请参阅此官方文档authentication works in App Service。
<强>更新强>
我已经检查过此https://github.com/Azure-Samples/active-directory-xamarin-native-v2,并在验证用户身份并获取访问令牌时使用fiddler来捕获网络包。我发现MSAL正在对Microsoft Graph and REST起作用,当用户登录时,您只能检索X-ZUMO-AUTH
和authentionToken
,并且这两个都无法用于单点登录你的移动后端。
虽然有关使用MSA的Azure移动应用程序的客户端管理身份验证的官方代码示例正在使用Live SDK。正如Live SDK REST API提到的signing users,您可以获得访问令牌和身份验证令牌,用于单点登录方案。此外,我已检查Server-managed authentication并发现MSA的应用服务身份验证/授权也使用Live SDK REST API。
总之,您无法使用MSAL进行客户端管理的MSA身份验证,对于客户端管理的身份验证,您需要利用Live SDK检索access_token
,然后调用id_token
来检索authentication_token
来自您的移动后端。或者您可以只为MSA利用服务器管理的身份验证。有关Live SDK的更多详细信息,请参阅LiveSDK。