在尝试访问asp.net核心web api时,MobileServiceClient InvokeApiAsync获得401

问题描述 投票:0回答:1

我有一个Xamarin Forms应用程序,它与Azure App Service上托管的Asp.net Core Web api进行交互,并使用Azure B2C身份验证进行客户端身份验证。

应用程序可以使用LoginAsyc成功登录Azure(我得到idtoken)但是当我尝试使用MobileServiceClient调用需要授权的服务时,我得到401.使用InvokeApiAsync调用api。

如果我调用一个不需要授权的api方法,它可以正常工作。

我打开了Azure日志,只看到401错误。

知道如何使用MobileServiceClient从Xamarin调用此安全操作方法。

请帮忙

大卫

azure asp.net-core azure-web-sites azure-ad-b2c
1个回答
0
投票

应用程序可以使用LoginAsyc成功登录Azure(我得到idtoken)但是当我尝试使用MobileServiceClient调用需要授权的服务时,我得到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的bearer token。对于Web API Web应用程序,我使用本机应用程序在Azure门户上配置我的AD身份验证。

此外,您可以为您的移动客户端创建本机aad应用程序,并为您的Azure应用程序创建WebAPI aad应用程序。此时,您可以指定本机aad应用程序的有效范围以访问WebAPI应用程序。然后,您将检索access_token,此时您需要将WebAPI应用程序ID设置为客户端ID,或将其添加到Azure门户上的ALLOWED TOKEN AUDIENCES列表中。

总之,您需要确保audid_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

© www.soinside.com 2019 - 2024. All rights reserved.