Azure AD服务器身份验证,无权查看目录

时间:2016-08-10 13:07:06

标签: azure webserver xamarin.forms azure-active-directory

我创建了一个Xamarin.Forms项目和一个Table API项目。两者都是通过Azure门户中的QuickStart菜单创建的。

我已经在门户中配置了Azure AD,我可以通过我的XForms应用程序从AD成功检索令牌。但是当我尝试使用MobileServiceClient中的LoginAsync方法登录Table API时,我收到"您无权查看到目录或页面。"

我一直在浏览以下指南,但没有运气。

How to configure your App Service application to use Azure Active Directory login

Add authentication to your Xamarin.Forms app

How to: Work with authentication

我也看了下面的问题,但没有找到解决方案。

Cordova AAD server flow authentication hangs on Android and iOS

我认为我可能会错过Table API项目的某些特定身份验证吗?

以下是我的代码和设置:

XFORMS中的PCL项目

var ar = await authContext.AcquireTokenAsync(Constants.GraphResourceUri, Constants.ClientId, userCredintials);

            JObject payload = new JObject();
            payload["access_token"] = ar.AccessToken;

            var client = new MobileServiceClient(Constants.ApplicationUrl);
            var user = await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);

Constants.ClientID是Native Client应用程序的ClientId,而不是Web服务器。如果我切换它,我会得到一个404。

来自TABLE API项目的控制器示例

[Authorize]
public class StatisticController : ApiController

TABLE API StartUp.cs CONFIGURATION

public void Configuration(IAppBuilder app)
    {
        app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions());
        ConfigureMobileApp(app);
    }

移动服务AUTH SETUP enter image description here

单次登录广告设置 enter image description here

NATIVE客户端应用设置 enter image description here enter image description here

修改

我可以使用以下设置通过PostMan复制错误: enter image description here

我试图加入一个" X-ZUMO-AUTH"具有access_token值但具有相同结果的标头。仍然没有许可。我还尝试排除POST请求中的每个标头但没有任何更改。 这是否意味着不允许来自我的移动应用或Postmand的POST请求?

如果我在浏览器中手动浏览到mysite.azurewebsites.net/.auth/login/aad,那么我可以从我的AD用户登录。因此,似乎AD正在与服务正确通信,反之亦然。

固定IT

非常感谢mattchenderson!他建议我应该将常量GraphResourceUri更改为我的服务的客户端ID而不是普通的图形api。除了添加客户端的单个实例,我现在还可以成功登录我的服务。

1 个答案:

答案 0 :(得分:1)

允许POST请求,我一直使用Postman进行测试。

此类问题的最常见原因是受众群体验证问题。受众是AAD令牌的属性,该令牌表示此令牌的有效资源。鉴于上面的代码,我希望观众等于Constants.GraphResourceUri。我的猜测是,这实际上是图形API,而不是您的应用程序,这会导致验证失败,尽管我希望在您调用LoginAsync()时发生这种情况。我建议改为尝试使用Web应用程序客户端ID("移动服务AUTH SETUP"屏幕截图中的客户端ID)。

为了更轻松地进行调试,您可以将AAD令牌转换为http://jwt.io,这样可以帮助您查看令牌属性。 " AUD"预计与门户网站中注册的应用程序的客户端ID相同,并且您希望issuer字段也匹配。确保令牌未过期。

使用令牌访问受保护的API时,有两种方法可以提供它:

  1. 在请求的X-ZUMO-AUTH标头中使用作为LoginAsync()的一部分返回的标记。这将由SDK自动完成,以便使用相同的MobileServiceClient进行表操作。
  2. 根据承载令牌规范直接使用AAD令牌。也就是说,将其包含在Authorization标头中,使用值" Bearer",将token替换为您的值。
  3. 此外,我在您的代码中看到您正在为登录操作创建新的MobileServiceClient。这是我们通常不鼓励的,因为登录信息附加到MobileServiceClient对象。如果您丢失了对此的引用,则会丢失登录信息(以及一些其他设置),并且它们不会应用于您的表操作。建议使用在其他地方引用的单个实例 - 例如,在Xamarin中,共享代码中的静态变量。