没有对话框提示的ADAL身份验证

时间:2016-05-23 07:10:25

标签: azure dynamics-crm azure-active-directory dynamics-crm-online adal

我在Azure AD中注册了一个连接到CRM Online的控制台应用程序(使用these steps配置)。它查询Web API。

应用程序需要在没有用户交互的情况下运行...但遗憾的是,对str.stringByReplacingOccurrencesOfString("\"", withString: "") 的调用始终失败,只有AcquireTokenSilentAsync有效。这会出现一个用户登录对话框,该对话框无法满足用户交互要求!

有没有办法阻止此提示,可以通过在客户端计算机上保存登录位置(目前尚未使用)或者使用证书(但是如何执行此操作) ?)或其他什么?

我正在使用ADAL for .NET v3.10.305110106版本。以下代码用于验证:

AcquireTokenAsync

2 个答案:

答案 0 :(得分:5)

感谢@aravind指出了active-directory-dotnet-native-headless样本。

该示例包含FileCache class,其继承自Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache。该类管理将凭据缓存到磁盘上的加密文件。这意味着首次运行时只有一个提示,之后凭据在本地存储。

最后的难题是:

  1. 调用其他构造函数签名以使用FileCache初始化AuthenticationContext

    _authInfo.Context = new AuthenticationContext(
        _authInfo.AuthorityUrl, false, new FileCache());
    
  2. 从用户获取凭据到Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential对象(请参阅TextualPrompt() method in the sample

  3. 将凭据传递给AcquireTokenAsync()的其他方法签名:

    authResult = await _authInfo.Context.AcquireTokenAsync(
        _authInfo.Resource, _authInfo.ClientId, userCredential);
    

答案 1 :(得分:1)

如果“应用程序需要在没有用户交互的情况下运行”,请使用ClientCredential流程,例如:

public static string GetAccessTokenUsingClientCredentialFlow(Credential cred) {           

        AuthenticationContext ac = new AuthenticationContext(cred.Authority);
        AuthenticationResult r = ac.AcquireTokenAsync(cred.ResourceId, new ClientCredential(cred.ClientId, cred.ClientSecret)).Result;
        return r.AccessToken;
    }