当前位置: 首页 > 知识库问答 >
问题:

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

石思淼
2023-03-14

我已经创建了一个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方法有很多重载方法,但不确定应该使用什么方法。

    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登录页面作为弹出窗口显示给用户,然后在用户输入creds后,使用该信息创建UserAssertion对象?

谢谢

共有1个答案

艾昊明
2023-03-14

请在此阅读更多关于协议流的描述。也请参阅本机应用程序到Web API场景的代码示例。

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

 类似资料:
  • 我编写了一个控制台ASP.NET应用程序来获取AccessTokens。我有clientId,我的应用程序的客户端秘密,我做了以下操作: var authContext=新的AuthenticationContext(“https://login.windows.net/common/oauth2/authorize”);var acquireTask=authContext.AcquireTok

  • 我有一个Web应用程序(Angular 7),它使用MSAL Angular对Azure AD用户进行身份验证,并获取访问我的Web API(.NET 4.6)的访问令牌。这两个应用都已在Azure门户中注册,并具有以下权限,如下所述: Web应用程序:for Web API(委派) Web API:<代码>用户。阅读邮政发送MS图表(委派) 现在,我想使用ADAL for从Web API调用Mi

  • 问题内容: 我正在尝试使用Flask访问用户代理,但是我找不到有关它的文档,或者它没有告诉我。 问题答案: 您还可以使用包含以下属性的对象,这些属性是基于useragent字符串创建的: 平台(Windows,Linux,MacOS等) 浏览器(chrome,firefox,msie等) 版 语言 字串()

  • 经过很多挣扎(以及大量的指导,指南等),我设法设置了一个小型的.NET Core REST Web API,当存储的用户名和密码有效时,使用身份验证控制器颁发JWT令牌。 令牌将用户ID存储为子声明。 我还设法设置了Web API,以便在方法使用Authorize注释时验证这些标记。 现在我的问题是:我如何在我的控制器(在一个Web API中)中读取用户id(存储在主题声明中)? 这基本上是这个问

  • 如何在MVC 5中获取当前登录用户的id?我尝试了StackOverflow建议,但它们似乎不适用于MVC 5 另外,MVC 5为用户分配资源的最佳实践是什么?(例如,