我创建了一个类型为webapp的Azure AAD应用程序,它具有客户端密钥和重定向URL。现在,我想使用AAD应用程序代表用户获取访问令牌。从查看文档,到目前为止,我得到了以下代码。
CatalogueItem
但是当我尝试获取用户令牌时,这是我得到的错误如下。
消息“AADSTS70002:请求正文必须包含以下内容 参数:'client_secret或client_assertion'。\ r \ nTrace ID: 0e977f67-d5cb-4cf5-8fea-bac04b6d0400 \ r \ n相关ID: 824a96bf-8007-4879-970c-2680644b8669 \ r \ n时间戳:2017-07-21 05:02:41Z“string
为什么我会收到此错误以及如何解决此问题? 我是否需要先与用户登录然后再使用UserAssertion? AcquireTokenAsync方法有多吨重载方法,但不确定我应该使用什么。
我还看了这个github网址,看看他们是怎么做的 https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof/blob/8afb3e6a648d8e7246685bf6747d009006c761b8/TodoListService/Controllers/TodoListController.cs
这是获取记录在用户
中的令牌的相关代码 static void Main(string[] args)
{
var clientId = "<REDACTED>";
var clientSecret = "<REDACTED>";
var resourceAppIdURI = "https://api.office.com/discovery/";
var authority = "https://login.microsoftonline.com/common";
AuthenticationContext ac = new AuthenticationContext(authority, new FileCache());
ClientCredential cc = new ClientCredential(clientId, clientSecret);
// Get token as application
var task = ac.AcquireTokenAsync(resourceAppIdURI, cc);
task.Wait();
var appToken = task.Result.AccessToken;
// Get tokenn on behalf of user
UserCredential uc = new UserCredential("usrname@mytenant.com");
task = ac.AcquireTokenAsync(resourceAppIdURI, clientId, uc);
var userToken = task.Result.AccessToken;
Console.ReadLine();
}
在这里,他们已经有一个登录用户并从该登录用户的令牌创建UserAssertion。在我的控制台应用程序中,用户尚未登录。 所以我需要一种方法在我的控制台应用程序中执行此操作。如何向用户显示AAD登录页面作为弹出窗口,然后一旦用户输入creds使用该信息创建UserAssertion对象?
感谢
答案 0 :(得分:1)
您的方案是一个本机应用程序,代表用户调用Web API。本机应用程序可以使用OAuth 2.0 authorization code grant为用户获取访问令牌,然后在请求中将访问令牌发送到Web API,Web API授权用户并返回所需的资源:
请阅读有关协议流here的说明的更多信息。另请参阅本地应用程序到Web API方案的code samples。
此外,您可以单击here获取有关如何从本机客户端(.net控制台应用程序)调用Azure AD Graph API的代码示例,它使用Active Directory身份验证库(ADAL)进行身份验证。