我有一个Xamarin Forms应用程序,它与Azure App Service上托管的Asp.net Core Web api进行交互,并使用Azure B2C身份验证进行客户端身份验证流程。
应用程序可以使用LoginAsyc成功登录Azure(我得到idtoken)但是当我尝试使用MobileServiceClient调用需要授权的服务时,我得到401.使用InvokeApiAsync调用api。
如果我调用一个不需要授权的api方法,它可以正常工作。
我打开了Azure日志,只看到401错误。
任何想法如何使用MobileServiceClient从Xamarin调用此安全操作方法。
请帮忙
大卫
答案 0 :(得分:0)
应用可以使用 LoginAsyc (我得到 idtoken )成功登录Azure但是当我尝试使用MobileServiceClient调用需要授权的服务时,我得到a 401.使用InvokeApiAsync调用api。
根据您的描述,我假设您使用的是App Service Authentication / Authorization。对于Client-managed authentication,您直接联系AAD身份提供者并检索id_token或access_token。此时,您可以按如下方式访问授权端点:
https://{your-app-name}.azurewebsites.net/api/values
Authorization: Bearer {aad id_token or access_token}
注意:在构建MobileServiceClient
时,您可以传递自定义DelegatingHandler
以在将请求发送到Azure后端之前附加持有者令牌。
我刚刚在我的B2C租户中创建了一个Native应用程序,并使用MSAL检索id_token或access_token,如下所示:
var authority = "https://login.microsoftonline.com/tfp/{Tenant}/{Policy}";
PublicClientApplication IdentityClientApp = new PublicClientApplication("{native-app-id}", authority);
IdentityClientApp.RedirectUri = $"msal{native-app-id}://auth";
var scopes = new string[] {
//"https://bruceb2c.onmicrosoft.com/EasyAuthB2CApp/user.read"
""
};
var result=await IdentityClientApp.AcquireTokenAsync(scopes);
注意:我刚创建了一个原生应用,scopes
方法中的参数AcquireTokenAsync
不支持clientId,所以我只传递空范围,在此请注意,您不会收到access_token,只需使用id_token
作为持票人令牌即可访问您的Web API。对于Web API Web应用程序,我使用本机应用程序在Azure门户上配置我的AD身份验证。
此外,您可以为您的移动客户端创建本机aad应用程序,并为您的Azure应用程序创建WebAPI aad应用程序。此时,您可以指定本机aad应用程序的有效范围以访问WebAPI应用程序。然后,您将检索access_token,此时您需要将WebAPI应用程序ID设置为客户端ID,或将其添加到Azure门户上的允许的令牌听众列表中。
总之,您需要确保aud
或id_token
中的access_token
属性与Azure门户上的Azure Active Directory身份验证设置相匹配。 注意:您可以使用https://jwt.io/解码令牌并检查相关属性。
此外,对于使用LoginAsync
的客户端流认证,您需要传递access_token以使用您的Web应用程序登录,然后您将检索authenticationToken
。移动客户端库会将authenticationToken
x-zumo-auth
标头添加到后续请求中(例如,使用MobileServiceClient.InvokeApiAsync
)。
此外,这里有一些教程,你可以参考它们:
App Service Auth and Azure AD B2C
Integrate Azure AD B2C into a Xamarin forms app using MSAL
Azure AD B2C: Requesting access tokens
ASP.NET Core 2.0 web API with Azure AD B2C using JWT Bearer middleware