我有一个WCF服务,需要最终获得一个令牌来与azure中托管的web api服务进行通信。我们的内部活动目录与我们的azure帐户同步。
最初,我在win form app中玩了一个游戏并使用以下内容成功获得了一个令牌:
AuthenticationResult authResult = authContext.AcquireToken(apiResourceId, clientId, redirectUri);
这虽然弹出了一个登录对话框,因此对Windows服务没什么用处。然后我调查了AcquireTokenSilent()的使用。然而,这仍然抛出一个异常,告诉我将AcquireToken调回方阵1。
我的下一个停靠点是查看AcquireTokenByAuthorizationCode()。我的问题是如何获取授权代码,这是第一个参数。
我试过了:
var url = authContext.GetAuthorizationRequestURL(apiResourceId, clientId, redirectUri, UserIdentifier.AnyUser, string.Empty);
HttpClient hc = new HttpClient();
HttpResponseMessage hrm = hc.GetAsync(url).Result;
这虽然只是返回一个html页面,显示我认为微软登录页面。它当然不包含任何代码。
关于我做错的任何想法?
答案 0 :(得分:1)
只有在缓存中已有令牌时,AcquireTokenSilent才有效,而在您的场景中并非如此。 AcquireTokenByAuthorizationCode意味着在服务器端起诉。 https://github.com/Azure-Samples/active-directory-dotnet-native-headless中显示了在不在客户端弹出对话框的情况下获取令牌的主要方式,但存在重要的限制。如果它们在您的场景中工作正常,则可以考虑创建持久性缓存,通过执行一次交互式身份验证来启动它,然后通过AcquireTokenSilent继续使用服务中的相同缓存。只要您每14天至少使用一次,缓存的刷新令牌将持续90天。