如何在Xamarin.iOS中从ADAL获取令牌?

vrw*_*wim 6 xamarin.ios ios adal

我想从ADAL获取一个令牌来验证特定的服务器调用.

我试过使用这段代码:

var authorityUrl = string.Format(@"https://login.microsoftonline.com/{0}/oauth2/token", AadInstance);
var context = new AuthenticationContext(authorityUrl);
var credential = new ClientCredential(ClientId, ClientSecret);
var authenticationResult = context.AcquireTokenAsync(RemoteClientId, credential).Result;
return authenticationResult.AccessToken;
Run Code Online (Sandbox Code Playgroud)

但是我在日志中得到了这个:

AcquireTokenHandlerBase.cs: === Token Acquisition started:
    Authority: https://login.microsoftonline.com/f9e55202-63c0-4821-9fc7-e38eb5bc3a08/oauth2/token/
    Resource: 80d147c1-0b9a-48e0-8a62-1dc82890e98e
    ClientId: cab18d6f-3edc-446b-a071-45b28b192f0b
    CacheType: null
    Authentication Target: Client

TokenCache.cs: Looking up cache for a token...
TokenCache.cs: No matching token was found in the cache
AcquireTokenHandlerBase.cs: System.NullReferenceException: Object reference not set to an instance of an object
  at Microsoft.IdentityModel.Clients.ActiveDirectory.BrokerHelper.get_CanInvokeBroker () [0x0000c] in <f671779d8b3b49399b31bf519785e86e>:0 
  at Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase+<RunAsync>d__55.MoveNext () [0x00389] in <e4081d9da4634689910019c82c03f3e7>:0
Run Code Online (Sandbox Code Playgroud)

我不知道这可能有什么问题,因为这个相同的代码在Android应用程序上按预期工作,而它在iOS版本上不起作用.

Dan*_*ian 0

您的代码中有一些有趣的事情。首先,iOS 和 Android 应用程序是公共客户端,因此无法正确保护客户端机密。您永远不应该在您的应用程序中存储客户端机密。因此,客户端凭据流不适用于这种情况,也不可能适用于这种情况,而是服务器到服务器应用程序身份验证。这可能是您错误的根本原因。

以下是如何使用 ADAL 为所有 Android、iOS、Win 桌面、Windows 通用版构建 Xamarin 应用程序的绝佳示例。我强烈建议遵循此处提出的模式。