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

Azure访问令牌不工作

秦伯寅
2023-03-14

下面的代码运行良好,并从azure返回所需的访问令牌,但如果我试图用它从节点js或postman执行相同的函数,则会提示一个错误,如下所示:

{“Error”:“invalid_client”,“error_description”:“aadsts70002:验证凭据时出错。aadsts50012:提供了无效的客户端机密。\r\n跟踪ID:922f61ca-0349-47fc-8c60-326cb29b2000\r\n相关ID:3d39e54d-deb2-49de-84c0-9705e2977c2e\r\n时间戳:2017-07-18 14:29:14z”,“error_codes”:[70002,50012],“时间戳”:“2017-07-18 14:29:14z”,“trace_id”:“922f6 1CA-0349-47FC-8C60-326CB29B2000”,“CORRelation_ID”:“3D39E54D-DEB2-49DE-84C0-9705E2977C2E”}

但在java环境中,任何次数都能很好地工作

 HttpPost httpPost = new HttpPost("https://login.microsoftonline.com/" + environment.getTenantId() + "/oauth2/token");
 List<NameValuePair> nameValuePairs = new ArrayList(3);
 nameValuePairs.add(new BasicNameValuePair("grant_type", "client_credentials"));
 nameValuePairs.add(new BasicNameValuePair("client_id", environment.getClientId()));
 nameValuePairs.add(new BasicNameValuePair("client_secret", environment.getClientSecret()));
 nameValuePairs.add(new BasicNameValuePair("resource", "https://graph.windows.net"));
 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
 httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
 HttpResponse response = httpClient.execute(httpPost);
 String postResponse = EntityUtils.toString(response.getEntity());
 String startPoint = "\"access_token\":\"";
 int startIndex = postResponse.indexOf(startPoint);
 int adjustPoint = startIndex + startPoint.length();
 String objectId = postResponse.substring(adjustPoint);
 int tokenLength = objectId.length();
 String accessToken = objectId.substring(0, tokenLength - 2);
 return accessToken;

共有1个答案

叶富
2023-03-14

对我来说,HttpClientAPI总是工作得很好。我认为您正在使用的类没有正确地对值进行编码。

// Static field within class to share the same client instance
private static HttpClient Client = new HttpClient();

public async Task<string> GetAccessTokenAsync()
{
    //Get the environment variable from somewhere

    var request = new HttpRequestMessage(HttpMethod.Post, "https://login.microsoftonline.com/" + environment.getTenantId() + "/oauth2/token");

    var keyValues = new List<KeyValuePair<string, string>>();
    keyValues.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
    keyValues.Add(new KeyValuePair<string, string>("client_id", environment.getClientId()));
    keyValues.Add(new KeyValuePair<string, string>("client_secret", environment.getClientSecret()));
    keyValues.Add(new KeyValuePair<string, string>("resource", "https://graph.windows.net"));

    request.Content = new FormUrlEncodedContent(keyValues);

    HttpResponseMessage response = await Client.SendAsync(request);

    string json = await response.Content.ReadAsStringAsync();

    JObject tokenResponse = JObject.Parse(json);

    string accessToken = tokenResponse["access_token"];
    return accessToken;
}
 类似资料:
  • 我想要下一个:从我的网站能够启动虚拟服务器(Ubuntu、linux、windows服务器)。我用AWS编辑了这个,通过IAM很容易找到访问密钥和令牌。 如果可能的话,我也希望使用Azure来获得访问密钥和令牌。我在这里找到了一些关于如何欣赏的教程:https://www.youtube.com/watch?v=ujzrq8Fg9Gc 我看到还有oAuth2,这太多了,无法为这个项目设置它。 还有

  • 我使用postMan,输入请求地址http://localhost:8011/umrah/oauth/token?client_id=client_2&username=1234567&password=123456&grant_type=password&client_secret=123456,点击send按钮,出现错误,在内存中工作正常,当我想使用Jdbc令牌存储时,想法控制台错误:找不到令

  • 我使用Azure AD作为具有IdentityServer4的外部IdP。要调用受AzureAd保护的API,我需要从Azure Ad获取访问令牌。是否可以在登录过程中获取访问令牌并将其保存到声明中? 我正在使用IdentityServer4快速启动UI。我试图在外部令牌的回调方法中捕获访问令牌,但在HttpContext或声明或ProcessLoginCallbackForOidc方法中没有找到

  • 我已经创建了两个独立的项目;一个用于我的应用程序api,另一个用于我的应用程序客户端。我使用的是。NET Core2.2和Angular 7。我读过一些文章,其中有人说要使用httponly cookie。我在这方面的问题是;如何使用Azure Active Directory B2C?我只是很困惑,所以如果有人能清理一些东西,我将不胜感激。

  • az登录--service-principal-u-p--租户--允许-不订阅 az帐户获取-访问-令牌-资源 现在,当我试图通过用户登录(az登录)切换服务主体登录来为用户实现相同的功能时 有人能帮我理解为什么会这样吗? 提前感谢!

  • 访问令牌凭据(以及任何机密的访问令牌属性)在传输和储存时必须保持机密性,并只与授权服务器、访问令牌生效的资源服务器和访问令牌被颁发的客户端共享。访问令牌凭据必须只能使用带有RFC2818定义的服务器身份验证的1.6节所述的TLS 传输。 当使用隐式授权许可类型时,访问令牌在URI片段中传输,这可能泄露访问令牌给未授权的一方。 授权服务器必须确保访问令牌不能被生成、修改或被未授权一方猜测而产生有效的