【发布时间】:2017-12-27 00:32:15
【问题描述】:
我创建了一个类型为 webapp 的 Azure AAD 应用程序,它具有客户端密码和重定向 URL。现在,我想代表使用 AAD 应用程序的用户获取访问令牌。通过查看文档,到目前为止,我得到了以下代码。
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();
}
但这是我尝试获取用户令牌时遇到的错误如下。
消息“AADSTS70002:请求正文必须包含以下内容 参数:“client_secret 或 client_assertion”。\r\n跟踪 ID: 0e977f67-d5cb-4cf5-8fea-bac04b6d0400\r\n相关 ID: 824a96bf-8007-4879-970c-2680644b8669\r\n时间戳:2017-07-21 05:02:41Z"字符串
为什么会出现此错误以及如何解决? 我需要先用用户登录,然后再使用 UserAssertion 吗? AcquireTokenAsync 方法有大量重载方法,但不确定我应该使用什么。
我还查看了这个 github 网址,看看他们是如何做到的 https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof/blob/8afb3e6a648d8e7246685bf6747d009006c761b8/TodoListService/Controllers/TodoListController.cs
这是登录用户获取令牌的相关代码
ClientCredential clientCred = new ClientCredential(clientId, appKey);
var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
string userAccessToken = bootstrapContext.Token;
UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(authority, new DbTokenCache(userId));
在这里,他们已经有一个登录用户,并从该登录用户的令牌创建了一个 UserAssertion。在我的控制台应用程序中,用户尚未登录。 所以我需要一种在我的控制台应用程序中执行此操作的方法。如何将 AAD 登录页面作为弹出窗口显示给用户,然后在用户输入凭据后使用该信息创建 UserAssertion 对象?
谢谢
【问题讨论】:
标签: c# azure azure-active-directory adal azure-ad-graph-api