我在Azure AD中注册了一个连接到CRM Online的控制台应用程序(使用these steps配置)。它查询Web API。
应用程序需要在没有用户交互的情况下运行...但遗憾的是,对str.stringByReplacingOccurrencesOfString("\"", withString: "")
的调用始终失败,只有AcquireTokenSilentAsync
有效。这会出现一个用户登录对话框,该对话框无法满足用户交互要求!
有没有办法阻止此提示,可以通过在客户端计算机上保存登录位置(目前尚未使用)或者使用证书(但是如何执行此操作) ?)或其他什么?
我正在使用ADAL for .NET v3.10.305110106版本。以下代码用于验证:
AcquireTokenAsync
答案 0 :(得分:5)
感谢@aravind指出了active-directory-dotnet-native-headless样本。
该示例包含FileCache class,其继承自Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache
。该类管理将凭据缓存到磁盘上的加密文件。这意味着首次运行时只有一个提示,之后凭据在本地存储。
最后的难题是:
调用其他构造函数签名以使用FileCache初始化AuthenticationContext
:
_authInfo.Context = new AuthenticationContext(
_authInfo.AuthorityUrl, false, new FileCache());
从用户获取凭据到Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential
对象(请参阅TextualPrompt()
method in the sample)
将凭据传递给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;
}