C# HttpClient System.Net.Http.HttpRequestException:响应状态代码不表示成功:401(未经授权)
我正试图从asp.net核心应用程序向C# HttpClient System.Net.Http.HttpRequestException:响应状态代码不表示成功:401(未经授权),c#,asp.net-core,httpclient,access-token,dotnet-httpclient,C#,Asp.net Core,Httpclient,Access Token,Dotnet Httpclient,我正试图从asp.net核心应用程序向Auth0发送请求。 我使用的是HttpClient 问题是,当我在postman中创建相同的请求时,一切正常,但若我从.NET核心应用程序中使用它,它会抛出错误 System.Net.Http.HttpRequestException:响应状态代码不存在 表示成功:401(未经授权) 以下是邮递员的图片示例: 有关任务的更多详细信息: 请求类型为POST 成功呼叫将返回访问\u令牌 POST请求需要很少的正文参数: grant_类型 客户识别码 客户机密
Auth0
发送请求。
我使用的是HttpClient
问题是,当我在postman中创建相同的请求时,一切正常,但若我从.NET核心应用程序中使用它,它会抛出错误
System.Net.Http.HttpRequestException:响应状态代码不存在
表示成功:401(未经授权)
以下是邮递员的图片示例:
有关任务的更多详细信息:
请求类型为POST
成功呼叫将返回访问\u令牌
POST请求需要很少的正文参数:
标题
内容类型必须是application/x-www-form-urlencoded
因此,邮递员的请求如下所示:
{"grant_type":"client_credentials","client_id":"ClientId","client_secret":"ClientSecret","audience":"Audience"}
grant_type=client_credentials&client_id=ClientId&client_secret=ClientSecret&audience=Audience
??
授予\类型=客户端\凭据&客户端\ id=一些\我的\ id
&客户秘密=一些我的客户秘密
&听众=https://mydemoapplication.auth0.com/api/v2/
而且这个效果非常好
但是当我试图从.NET CORE Web api
重复相同的操作时,我总是得到401(未经授权)。
这是我的C#代码:
首先,我们从方法RequestTokenFromAuth0
public async Task<string> RequestTokenFromAuth0(CancellationToken cancellationToken)
{
// tokenUrl represents https://mydemoapplication.auth0.com/oauth/token
var tokenUrl = $"{_auth0HttpConfig.TokenEndpoint}";
// Creating anonymous object which will be used in post request
var data = new
{
grant_type = "client_credentials",
client_id = _auth0HttpConfig.ClientId ,
client_secret = _auth0HttpConfig.ClientSecret,
audience = _auth0HttpConfig.Audience
};
//var data = $"grant_type=client_credentials&client_id={_auth0HttpConfig.ClientId}&client_secret={_auth0HttpConfig.ClientSecret}&audience={_auth0HttpConfig.Audience}";
var response = await _auth0Client.PostToken<Auth0Auth>(tokenUrl, data, cancellationToken);
if(response!= null && response.Success && response.Data != null && !string.IsNullOrWhiteSpace(response.Data.Token))
{
return response.Data.Token;
}
else
{
throw new ArgumentException("Token is not retrieved.");
}
}
public async Task<T> PostToken<T>(string endpoint, object jsonObject, CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(endpoint))
{
throw new ArgumentNullException(endpoint);
}
var reqMessage = GenerateTokenRequestMessage(HttpMethod.Post, jsonObject, endpoint);
var result = await GetResult<T>(httpRequestMessage, cancellationToken);
return result;
}
public HttpRequestMessage GenerateTokenRequestMessage(HttpMethod httpMethod, object objectToPost, string endpoint)
{
var httpRequestMessage = new HttpRequestMessage(httpMethod, endpoint);
var serializedObjectToCreate = JsonConvert.SerializeObject(objectToPost, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
httpRequestMessage.Content = new StringContent(serializedObjectToCreate);
httpRequestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
return httpRequestMessage;
}
private async Task<T> GetResult<T>(HttpRequestMessage request, CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response = await _client.SendAsync(request, cancellationToken);
response.EnsureSuccessStatusCode(); // THIS LINE Throws exception 401 Unathorized
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result);
}
catch (Exception ex)
{
throw;
}
}
公共异步任务RequestTokenFromAuth0(CancellationToken CancellationToken)
{
//tokenUrl表示https://mydemoapplication.auth0.com/oauth/token
var tokenUrl=$“{u auth0HttpConfig.TokenEndpoint}”;
//创建将在post请求中使用的匿名对象
var数据=新
{
授予\u type=“客户\u凭证”,
客户端\u id=\u auth0HttpConfig.ClientId,
客户端\u secret=\u auth0HttpConfig.ClientSecret,
访问群体=\u auth0HttpConfig.audience
};
//var data=$“授权类型=客户端凭据&客户端id={{u auth0HttpConfig.ClientId}客户端密码={{u auth0HttpConfig.ClientSecret}&访问群体={{u auth0HttpConfig.acience}”;
var response=await\u auth0Client.PostToken(令牌URL、数据、取消令牌);
if(response!=null&&response.Success&&response.Data!=null&&string.IsNullOrWhiteSpace(response.Data.Token))
{
返回response.Data.Token;
}
其他的
{
抛出新ArgumentException(“未检索到令牌”);
}
}
公共异步任务PostToken(字符串端点、对象jsonObject、CancellationToken CancellationToken)
{
if(string.IsNullOrWhiteSpace(端点))
{
抛出新的ArgumentNullException(端点);
}
var reqMessage=GenerateTokenRequestMessage(HttpMethod.Post,jsonObject,endpoint);
var result=await GetResult(httpRequestMessage,cancellationToken);
返回结果;
}
公共HttpRequestMessage GenerateTokenRequestMessage(HttpMethod HttpMethod,对象objectToPost,字符串端点)
{
var httpRequestMessage=新的httpRequestMessage(httpMethod,端点);
var serializedObjectToCreate=JsonConvert.SerializeObject(objectToPost,新的JsonSerializerSettings
{
NullValueHandling=NullValueHandling.Ignore
});
httpRequestMessage.Content=新的StringContent(serializedObjectToCreate);
httpRequestMessage.Content.Headers.ContentType=新的MediaTypeHeaderValue(“application/x-www-form-urlencoded”);
返回httpRequestMessage;
}
专用异步任务GetResult(HttpRequestMessage请求,CancellationToken CancellationToken)
{
尝试
{
HttpResponseMessage response=wait_client.SendAsync(请求,取消令牌);
response.EnsureSuccessStatusCode();//此行抛出异常401 unhorized
var result=await response.Content.ReadAsStringAsync();
返回JsonConvert.DeserializeObject(结果);
}
捕获(例外情况除外)
{
投掷;
}
}
这里出了点问题,我不知道为什么我变得不受欢迎,这里可能出了什么问题,我真的不确定!任何形式的帮助都会很好
邮递员又重复了一遍,一切都很好
谢谢
干杯既然您是从dotnet访问它,我建议使用Auth0 NuGet包
公共类问题代码
{
公共异步任务GetToken()
{
var client=newauthenticationapiclient(“”);
var tokenRequest=new ClientCredentialsTokenRequest
{
ClientId=“”,
ClientSecret=“”,
观众=”,
};
var token=wait client.GetTokenAsync(tokenRequest);
返回token.AccessToken;
}
}
我在一个虚拟auth0api上测试了它,它按预期工作
快乐编码 既然您是从dotnet访问它,我建议使用Auth0 NuGet包
_auth0Client.PostToken<Auth0Auth>(tokenUrl, data, cancellationToken);
公共类问题代码
{
公共异步任务GetToken()
{
var client=newauthenticationapiclient(“”);
var tokenRequest=new ClientCredentialsTokenRequest
{
ClientId=“”,
ClientSecret=“”,
观众=”,
};
var token=wait client.GetTokenAsync(tokenRequest);
返回token.AccessToken;
}
}
我在一个虚拟auth0api上测试了它,它按预期工作
快乐编码
_auth0Client.PostToken<Auth0Auth>(tokenUrl, data, cancellationToken);
但在这里,您将数据序列化为JSON,并希望它是application/x-www-form-urlencoded
。但情况显然不是这样。您正在生成的内容如下所示:
{"grant_type":"client_credentials","client_id":"ClientId","client_secret":"ClientSecret","audience":"Audience"}
grant_type=client_credentials&client_id=ClientId&client_secret=ClientSecret&audience=Audience
但是,它应该是这样的:
{"grant_type":"client_credentials","client_id":"ClientId","client_secret":"ClientSecret","audience":"Audience"}
grant_type=client_credentials&client_id=ClientId&client_secret=ClientSecret&audience=Audience
你可以使用