【发布时间】:2017-07-22 23:11:24
【问题描述】:
我有一个托管在 azure 中的网络应用程序。当我使用邮递员提出请求时,我得到一个 json 结果,这是正确的响应。当我尝试使用相同的令牌通过 C# 发出相同的请求时,我收到一个 errpr - 远程服务器返回一个错误:(401) Unauthorized。
这是我用来发出请求的代码。
public string RequestData(string queryString, string token)
{
var request = (HttpWebRequest)WebRequest.Create(queryString);
request.Proxy = GetProxy();
request.Credentials = CredentialCache.DefaultCredentials;
request.PreAuthenticate = true;
request.UseDefaultCredentials = true;
request.Method = "GET";
request.ContentType = "application/json";
request.ContentLength = 0;
request.CookieContainer = new CookieContainer();
request.Headers.Add("authorization", "Bearer " + token);
using (var webresponse = request.GetResponse())
{
if (webresponse.GetResponseStream() == Stream.Null)
{
throw new Exception("Response stream is empty");
}
var response = (HttpWebResponse)webresponse;
if (response.StatusCode != HttpStatusCode.OK)
{
return response.StatusCode.ToString();
}
else
{
return response.StatusCode.ToString();
}
}
}
我已经仔细检查了令牌以确保它是正确的。 我想提的另一点是它最初在 没有启用拦截器的邮递员。这适用于 Advanced Rest Client。 在我启用“XHR”并安装 ARC cookie 交换之前,该请求不起作用。
我检查了 Fiddler 中的请求标头,发现除了授权标头(我也添加了)之外没有其他标头。
更新:
我在 Postman (https://www.getpostman.com/) 中收到了成功的回复 并使用 RestSharp 运行它为 c# 生成的代码。在回应中 抛出的错误是
“您无权查看此目录或页面。”
这表明令牌不正确。这是令人困惑的,因为它有效 在 Postman 和 Advanced Rest Client 中。另外我必须提到我检索令牌 在每次调用时使用 clientid 和 secret,使用以下代码:
public async static Task<AzureAccessToken> CreateOAuthAuthorizationToken(string clientId, string clientSecret, string resourceId, string tenantId)
{
AzureAccessToken token = null;
var oauthUrl=string.Format("https://login.microsoftonline.com/{0}/oauth2/token", tenantId);
var reqBody = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}",clientId, clientSecret);
var client = new HttpClient();
HttpContent content = new StringContent(reqBody);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
using (HttpResponseMessage response = await client.PostAsync(oauthUrl, content))
{
if (response.IsSuccessStatusCode)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AzureAccessToken));
Stream json = await response.Content.ReadAsStreamAsync();
token = (AzureAccessToken)serializer.ReadObject(json);
return token;
}
return null;
}
}
【问题讨论】:
-
是的,仔细检查过
-
在这种情况下,我认为您的代理正在阻止请求
-
我也尝试过设置代理。如果我不设置代理,我会收到 407 错误。我在家里运行时也遇到同样的错误
-
@ThiagoCustodio,我认为您对令牌不正确的看法是正确的。即使它在 Postman 和 Advanced Rest Client 中工作。我已经发布了更多关于如何检索令牌的代码。将追溯我的步骤以确保发出正确的令牌。感谢您的 cmets。
-
我推荐使用 Fiddler,然后你可以比较两个请求。
标签: c# azure asp.net-web-api