C# HttpClient System.Net.Http.HttpRequestException:响应状态代码不表示成功:401(未经授权)

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_类型 客户识别码 客户机密

我正试图从asp.net核心应用程序向
Auth0
发送请求。 我使用的是
HttpClient

问题是,当我在postman中创建相同的请求时,一切正常,但若我从.NET核心应用程序中使用它,它会抛出错误

System.Net.Http.HttpRequestException:响应状态代码不存在 表示成功:401(未经授权)

以下是邮递员的图片示例:

有关任务的更多详细信息:

请求类型为
POST

成功呼叫将返回
访问\u令牌

POST请求需要很少的正文参数:

  • grant_类型
  • 客户识别码
  • 客户机密
  • 听众
  • 标题
    内容类型必须是
    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包

  • 安装软件包Auth0.AuthenticationApi
  • 使用此基本代码作为获取令牌的真实代码的大纲
  • 公共类问题代码
    {
    公共异步任务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);
    
  • 安装软件包Auth0.AuthenticationApi
  • 使用此基本代码作为获取令牌的真实代码的大纲
  • 公共类问题代码
    {
    公共异步任务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
    
    你可以使用