我创建了一个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);
}
修改
我试图加入一个" X-ZUMO-AUTH"具有access_token值但具有相同结果的标头。仍然没有许可。我还尝试排除POST请求中的每个标头但没有任何更改。 这是否意味着不允许来自我的移动应用或Postmand的POST请求?
如果我在浏览器中手动浏览到mysite.azurewebsites.net/.auth/login/aad,那么我可以从我的AD用户登录。因此,似乎AD正在与服务正确通信,反之亦然。
固定IT
非常感谢mattchenderson!他建议我应该将常量GraphResourceUri更改为我的服务的客户端ID而不是普通的图形api。除了添加客户端的单个实例,我现在还可以成功登录我的服务。
答案 0 :(得分:1)
允许POST请求,我一直使用Postman进行测试。
此类问题的最常见原因是受众群体验证问题。受众是AAD令牌的属性,该令牌表示此令牌的有效资源。鉴于上面的代码,我希望观众等于Constants.GraphResourceUri
。我的猜测是,这实际上是图形API,而不是您的应用程序,这会导致验证失败,尽管我希望在您调用LoginAsync()
时发生这种情况。我建议改为尝试使用Web应用程序客户端ID("移动服务AUTH SETUP"屏幕截图中的客户端ID)。
为了更轻松地进行调试,您可以将AAD令牌转换为http://jwt.io,这样可以帮助您查看令牌属性。 " AUD"预计与门户网站中注册的应用程序的客户端ID相同,并且您希望issuer字段也匹配。确保令牌未过期。
使用令牌访问受保护的API时,有两种方法可以提供它:
LoginAsync()
的一部分返回的标记。这将由SDK自动完成,以便使用相同的MobileServiceClient进行表操作。此外,我在您的代码中看到您正在为登录操作创建新的MobileServiceClient
。这是我们通常不鼓励的,因为登录信息附加到MobileServiceClient
对象。如果您丢失了对此的引用,则会丢失登录信息(以及一些其他设置),并且它们不会应用于您的表操作。建议使用在其他地方引用的单个实例 - 例如,在Xamarin中,共享代码中的静态变量。