【问题标题】:oAuth2 web request works in browser but not in appoAuth2 网络请求在浏览器中有效,但在应用程序中无效
【发布时间】:2017-09-09 15:10:44
【问题描述】:

我有以下代码示例,我试图在 Xamarin 表单应用程序中验证 Azure 活动目录用户

URL(我已经删除了实际的客户端 ID)在浏览器中可以正常工作,但在尝试发送 http 请求时失败

错误消息显示“响应类型必须包含 client_id”

            string URL = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?"
                        + "client_id=xxxx-xxxxx-xxxxx-xxxxx-xxx"
                        + "&response_type=code"
                        + "&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient"
                        + "&response_mode=query"
                        + "&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fmail.read"
                        + "&state=12345";



            var webRequest = System.Net.WebRequest.Create(URL) as HttpWebRequest;

            System.Console.WriteLine(URL);

            if (webRequest != null)
            {
                webRequest.Method = "POST";
                webRequest.ServicePoint.Expect100Continue = false;
                webRequest.Timeout = 20000;

                webRequest.ContentType = "text/html";
                //POST the data.
                using (requestWriter = new StreamWriter(webRequest.GetRequestStream()))
                {
                    requestWriter.Write(postData);
                }
            }

            HttpWebResponse resp = (HttpWebResponse)webRequest.GetResponse();
            Stream resStream = resp.GetResponseStream();
            StreamReader reader = new StreamReader(resStream);

            ret = reader.ReadToEnd();

【问题讨论】:

    标签: azure oauth-2.0 xamarin.forms


    【解决方案1】:

    您将参数放在 URL 中,因此您需要使用 GET 方法,而不是 POST(就像您的浏览器在其地址栏中粘贴 URL 时所做的那样)。

    所以,替换:

    webRequest.Method = "POST";
    

    作者:

    webRequest.Method = "GET";
    

    并删除:

    //POST the data.
    using (requestWriter = new StreamWriter(webRequest.GetRequestStream()))
      {
        requestWriter.Write(postData);
      }
    

    【讨论】:

    • 如果我这样做,我会收到一条错误消息“方法为 GET 时无法发送数据”
    • 删除// POST the data之后的3行。它是无用的,因为它是一个 GET 方法。这解释了您的错误消息。
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 2016-07-11
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2017-10-19
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多