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

时间:2018-03-02 02:56:25

标签: azure asp.net-core azure-web-sites azure-ad-b2c

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

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

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

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

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

请帮忙

大卫

1 个答案:

答案 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门户上的允许的令牌听众列表中。

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