如何使用ADAL在.NET中获取On-Behalf-Of-User令牌

时间:2017-07-21 05:16:15

标签: c# azure azure-active-directory adal azure-ad-graph-api

我创建了一个类型为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对象?

感谢

1 个答案:

答案 0 :(得分:1)

您的方案是一个本机应用程序,代表用户调用Web API。本机应用程序可以使用OAuth 2.0 authorization code grant为用户获取访问令牌,然后在请求中将访问令牌发送到Web API,Web API授权用户并返回所需的资源: enter image description here

请阅读有关协议流here的说明的更多信息。另请参阅本地应用程序到Web API方案的code samples

此外,您可以单击here获取有关如何从本机客户端(.net控制台应用程序)调用Azure AD Graph API的代码示例,它使用Active Directory身份验证库(ADAL)进行身份验证。