使用Azure EasyTables进行身份验证-Azure ActiveDirectory

时间:2020-10-17 21:06:36

标签: azure xamarin.forms azure-web-app-service forms-authentication azure-mobile-services

一段时间以来,我一直在尝试对Azure应用服务的请求进行身份验证,但我完全感到困惑,我似乎无法让Microsoft.Azure.Mobile.Client接受并成功验证已知的“好”令牌。

总体而言,我想要做的就是能够成功拉起Xamarin Forms中的Web浏览器,通过Azure,Google或其他社交身份验证对用户进行身份验证,然后使用令牌针对Azure应用服务(EasyTables)进行身份验证),我已经在运行但未启用身份验证。出于某种原因,我发现的资源都没有提供明确的方法来完成此工作,我将不胜感激。

这是到目前为止我拥有的主要配置:

  1. 我有一个应用程序可以成功读取数据表并将其保存到Azure托管EasyTables实现中。使用标准格式读取(或写入)表:
var locations = (await App.MobileService.GetTable<Location>().ToListAsync());

在App.xaml.cs文件中实例化MobileServiceClient如下:

public static MobileServiceClient MobileService = new MobileServiceClient("https://mywebapp.azurewebsites.net");

如上所述,在访问和保存在线服务时,这种方法很好用。

  1. 要转到Azure门户,我已在“设置->身份验证/授权”下激活了“应用程序服务身份验证”,并且还设置了Azure Active Directory身份验证提供程序。在该提供程序下,我已经设置了Azure Active Directory实例的客户端ID(在“管理->应用程序注册”下)。

  2. 回到Xamarin,我已经成功地使用Steven Thewissen here的方法对此进行了身份验证。特别是,我创建了一个“ MSAuthService”帮助程序,该帮助程序成功启动了Web浏览器,使您可以使用Microsoft凭据登录,随后它就可以从Microsoft Graph中检索您的帐户名和其他内容-包括Access令牌。

  3. 我现在正尝试使用此访问令牌登录到我用于访问EasyTables的MobileService,使用以下操作:

                JObject auth_token_jobject = new JObject();
                auth_token_jobject["authenticationToken"] = token;

                var output = await App.MobileService.LoginAsync(
                    MobileServiceAuthenticationProvider.MicrosoftAccount,
                    auth_token_jobject);

但是,每当执行此操作时,仍然会收到上面最后一行所产生的“未经授权”错误。

我知道其他人(例如here似乎也有同样的问题,但该帖子没有解决方法。

我尝试过的其他事情,但未能完全完成。如上所述,尽管通过Microsoft Graph而不是通过我的Web服务成功进行身份验证,但我得到的最接近的过程是:

  1. 使用EasyTables等here进行授权的概述-尽管这似乎并未为Xamarin提供任何明确的身份验证代码。
  2. 最新的Xamarin博客和说明材料(herehere,但是尽管使用await WebAuthenticator.AuthenticateAsync方法的过程似乎比我上面使用的示例简单得多,但是没有似乎没有提供有关如何生成调用身份验证页面所需的URI的任何详细信息,也没有提供有关如何实现它的逐步指南。无论哪种方式,我都没有设法使其正常工作...

如果有人能够轻松地获取有效令牌,然后将其提供给MobileService客户端,我将不胜感激。我怀疑这很简单,例如从上面的Xamarin Essentials WebAuthenticator中取回令牌,然后将其与var output = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount,auth_token_jobject)一起传递,但到目前为止我似乎无法正常工作。

非常感谢!

Oliver。

1 个答案:

答案 0 :(得分:0)

这里有几个问题(重读几次)

  1. 您正在使用 MobileServiceAuthenticationProvider.MicrosoftAccount - 您应该使用“aad”。
  2. AAD 需要访问令牌 - 有关需要提供的内容的详细信息,请参阅 https://docs.microsoft.com/en-us/azure/app-service/app-service-authentication-how-to#validate-tokens-from-providers

如果您取回的令牌确实是 MSA 令牌,那么您仍然需要提供 access_token 字段(而不是 authenticationToken 字段)

如果你不需要任何特别的东西,你应该可以像这样使用 .login() :

await App.MobileService.LoginAsync("aad", "your-method");

有关这方面的更多详细信息,请参阅其中一份认证