【问题标题】:Authenticate client application with Azure Active Directory使用 Azure Active Directory 对客户端应用程序进行身份验证
【发布时间】:2015-05-22 08:51:47
【问题描述】:

美好的一天!

我正在尝试配置我的 Azure API 应用程序,使其只能由受信任的应用程序通过使用 Azure AD(公共身份验证)访问。我在 AD 中为 WPF 应用程序和我的 API 应用程序创建了实体。我授予我的 WPF 应用程序实体访问我的 API 应用程序的权限。我使用以下方法访问我的 API。

        public Task<string> COGetOrganisationsAsync()
        {
            if(adAuth == null) adAuth = new coADAuthentication(ClientID, RedirectURL, Authority, ResourceURI);

            string token = adAuth.AcquireTokenOrRefresh();

            using(HttpClient httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

                Uri requestURI = new Uri(new Uri(Authority), "Organization/GetAll"); 
                HttpRequestMessage httpRequest = new HttpRequestMessage(new HttpMethod("POST"), requestURI);
                var req = httpClient.PostAsync(requestURI, httpRequest.Content).ContinueWith(httpResponseMessage =>
                {
                    return httpResponseMessage.Result.Content.ReadAsStringAsync();
                });

                return req.Result;
         }

我成功收到了一个有效的令牌,我将它添加到标题中。我的 req.Result 在以下消息中

{ “状态”:403,“来源”:“https://serviceplan-resourceg01234567890abcdef.azurewebsites.net/MyMethod/GetAll”, "message": "服务\"myService\" 的权限设置为公开 auth 但没有与请求关联的身份验证。” }

状态 403 告诉我服务器确实收到了我的请求,但它是禁止的。代码工作正常,因为当我将身份验证更改为公共时,我收到了正确的数据。

我不确定我的 Azure AD 配置是否正确,但我这几天一直在寻找解决方案。Azure 文档分散、过时或对我的特定场景没有用处。

我的问题是,还有其他人有同样的问题吗?有人可以向我推荐一些有用的文档吗?

非常感谢!

【问题讨论】:

  • 这也不限于 WPF。我已经尝试过 Cordova ADAL 插件以及 Windows 控制台 .NET 应用程序。结果相同。经过测试的 API 应用程序可直接从浏览器成功进行身份验证。 x-zumo-auth 标头有一个令牌,我可以从 angularjs 应用程序 $http 使用它,再次成功调用。使用本机应用程序的客户端 ID 从 ADAL 接收到的 accessToken 比 x-zumo-auth 标头大 - 不知道这是否相关 - 当我像“Bearer ”这样使用该令牌时,我得到 403 Forbidden。

标签: wpf authentication azure active-directory azure-api-apps


【解决方案1】:

很抱歉,您无法找到所需的内容。应用服务 API 应用为许多提供程序提供开箱即用的支持,您只需在网关处启用和配置即可。然后网关后面的服务将进行身份验证,并且它们都将共享相同的身份验证提供程序(当然,如果它们被配置为公共身份验证),因此 API App A 的调用者不必重新进行身份验证即可访问 API App B.

您可以在Protect an API app: Add Azure Active Directory or social provider authentication找到分步指南

话虽如此,那篇引起混乱或过时的文章是什么?我们正在努力使这些文章尽可能容易被发现,因此任何反馈都将帮助我们改进。

【讨论】:

    【解决方案2】:

    API 应用平台使用“zumo 令牌”抽象 API 应用的身份验证。这个想法是,无论您想使用哪个身份验证提供程序,例如 AAD、Facebook、Google、Twitter 或 Microsoft 帐户,它都(大部分)对您的客户端代码是透明的。一般流程是

    1. 您将管理 API 应用程序的网关配置为使用所需的身份验证提供程序。就你而言,AAD。
    2. 您要求用户在 https:///login/aad 登录
    3. 这会将 AAD 令牌放入网关并返回一个 zumo 令牌
    4. 然后您的客户端代码获取 zumo 令牌并使用它来调用 API 应用程序

    Panagiotis 指出的http://azure.microsoft.com/en-us/documentation/articles/app-service-api-dotnet-add-authentication/ 有详细信息。

    【讨论】:

    • 我已经将这个 URL 用于我自己的应用程序,不幸的是没有成功。我会尝试回顾所采取的步骤,也许我错过了一些东西。我会保持联系。感谢您的信息
    最近更新 更多