【问题标题】:Unable to get Access token and Refresh token无法获取访问令牌和刷新令牌
【发布时间】:2019-12-05 04:57:59
【问题描述】:

所有 ClientID、ClientSecret 和 RedirectURI 都放在 web.config 中。

<appSettings>      
    <add key="redirectURI" value="http://localhost:55593/oauthplayground" />
    <add key="clientId" value="uX4YpHHNm****ltekoG" />
    <add key="clientSecret" value="K5cSv3izT1GZ9PXnaWWfRWbTv10*****O3JkYFMlWMF3FhBtjyk0FqJduGJZSAL7B1DngJyxgX3KKNSD0Bqdv" />    
</appSettings>

现在我从这里得到了验证码。

static string redirectURI = ConfigurationManager.AppSettings["redirectURI"];
static string clientID = ConfigurationManager.AppSettings["clientID"];
static string clientSecret = ConfigurationManager.AppSettings["clientSecret"];

protected void btnclick_Click(object sender, EventArgs e)
{
    Response.Redirect(String.Format("https://d****o.com/o/authorize/?response_type=code&client_id={0}&redirect_uri={1}", clientID, redirectURI));
}

然后我得到了我的授权码:

3Q8tvb9d0fj232NZZIAIaItUIqtAd7 

(我将此代码存储在标签中,即lblcode.Text

然后对于 Access_token & Refresh token,我使用以下代码:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Request.QueryString.Get("code") != null)
                {     string AccessToken = string.Empty;  
                    lblcode.Text = Request.QueryString["code"].ToString();
                    string RefreshToken = ExchangeAuthorizationCode(lblcode.Text, out AccessToken);

                }
            }
        }

   private string ExchangeAuthorizationCode(string code, out string accessToken)
    {
        accessToken = string.Empty;
        string ClientSecret = clientSecret;
        string ClientId = clientID;
        //get this value by opening your web app in browser.    
        string RedirectUrl = redirectURI;
        var Content = "code=" + code + "&client_id=" + ClientId + "&client_secret=" + ClientSecret + "&redirect_uri=" + RedirectUrl + "&grant_type=authorization_code";
        var request = WebRequest.Create("https://drchrono.com/o/token/");
        request.Method = "POST";
        request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequired;

        byte[] byteArray = Encoding.UTF8.GetBytes(Content);
        request.ContentType = "application/x-www-urlencoded";
        request.ContentLength = byteArray.Length;
        //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
        //System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
        //ServicePointManager.ServerCertificateValidationCallback = (snder, cert, chain, error) => true;
        using (Stream dataStream = request.GetRequestStream())
        {
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
        }
        var Response = (HttpWebResponse)request.GetResponse();
        Stream responseDataStream = Response.GetResponseStream();
        StreamReader reader = new StreamReader(responseDataStream);
        string ResponseData = reader.ReadToEnd();
        reader.Close();
        responseDataStream.Close();
        Response.Close();
        if (Response.StatusCode == HttpStatusCode.OK)
        {
            var ReturnedToken = JsonConvert.DeserializeObject<Token>(ResponseData);
            if (ReturnedToken.refresh_token != null)
            {
                accessToken = ReturnedToken.access_token;
                return ReturnedToken.refresh_token;
            }
            else
            {
                return null;
            }
        }
        else
        {
            return string.Empty;
        }
    }  

但我收到一个错误:

请求被中止:无法创建 SSL/TLS 安全通道。

注意

  • 使用 POSTMAN,我可以获取所有数据。这意味着所有 API 都在工作 正确。
  • 代码中的列表项注释,我使用了那些但同样的问题 发生。
  • 我还使用 IISCrypto.exe 检查了我的系统,其中我 可以看到我所有的服务器、客户端协议(SSL 2.0、SSL 3.0、TLS 1.0、 TLS 1. 1、TLS 1.2) 已启用。

【问题讨论】:

  • 您是否检查以确保 response.Content 中有数据?
  • @Jawad - 否,内容显示空白。甚至不明白为什么它显示空白。
  • JObject.parse 在尝试解析“null” (JObject.Parse(“null”)) 时不幸抛出异常:-> 来自benohead.com/blog/2018/01/15/null-valid-json-text。对您的问题的回答是...检查其余呼叫失败的原因...您是否收到 200 响应代码,如果没有,请获取 response.error
  • btw.. 如果您的邮递员电话正常,我建议您查看:learning.getpostman.com/docs/postman/sending-api-requests/… 这很可能是您的 request.AddParameter 行导致错误
  • @Jawad 使用 POSTMAN,我成功运行了它。并且还得到了 200 Ok 响应代码。并且还接收访问和刷新令牌。但是用c#做不到。

标签: c# asp.net asp.net-web-api oauth-2.0 restsharp


【解决方案1】:

把这段代码放在上面

ServicePointManager.Expect100Continue = true;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

以下代码。
var request = WebRequest.Create("https://drchrono.com/o/token/");'

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 2020-08-11
    • 1970-01-01
    • 2015-07-19
    • 2017-03-22
    • 1970-01-01
    • 2022-01-23
    • 2023-03-22
    • 2021-01-29
    相关资源
    最近更新 更多