代码之家  ›  专栏  ›  技术社区  ›  user330612

如何使用ADAL在.NET中代表用户令牌

  •  2
  • user330612  · 技术社区  · 7 年前

        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:请求正文必须包含以下内容 0e977f67-d5cb-4cf5-8fea-bac04b6d0400\r\n相关ID: 824a96bf-8007-4879-970c-2680644b8669\r\n时间戳:2017-07-21 05:02:41Z“字符串

    为什么我会出现这个错误以及如何修复它? 我需要先与用户登录,然后使用UserAssertion吗?

    我还查看了这个github url,看看他们是怎么做的 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));
    

    所以我需要在我的控制台应用程序中实现这一点。如何将AAD登录页面作为弹出窗口显示给用户,然后在用户输入Cred后使用该信息创建UserAssertion对象?

    谢谢

    1 回复  |  直到 5 年前
        1
  •  2
  •   Nan Yu    7 年前

    您的场景是代表用户调用web API的本机应用程序。本机应用程序可以通过使用 OAuth 2.0 authorization code grant ,然后在请求中向web API发送访问令牌,web API授权用户并返回所需资源: enter image description here

    请阅读更多关于协议流的描述 here 。另请参见 code samples 用于本机应用程序到Web API场景。

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