如何在.Net控制台应用程序中获取持票人令牌?

时间:2014-07-19 16:09:46

标签: c# asp.net-mvc asp.net-web-api authorization

我正在关注如何从web-api服务器授权和获取持有者令牌的this教程。通过fiddler执行的任务非常简单,但是,当我尝试从控制台应用程序执行相同操作时,请求失败并显示400 Bad Request Error。以下是向服务器发出请求的代码:

var request = WebRequest.Create("http://localhost:12698/token") as HttpWebRequest;
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.CookieContainer = new CookieContainer();         
    var authCredentials = "userName=" + user + "&password=" + password;
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(authCredentials);
    request.ContentLength = bytes.Length;
    using (var requestStream = request.GetRequestStream()){
        requestStream.Write(bytes, 0, bytes.Length);
    }

    using (var response = request.GetResponse() as HttpWebResponse){
        authCookie = response.Cookies["access_token"];
    }

有人可以帮助我确定我在这里做错了吗?或者我是否应该使用其他方法来获取身份验证令牌?

2 个答案:

答案 0 :(得分:4)

FormUrlEncodedContent位于System.Net.Http

        static string GetToken(string userName, string password)
        {
            var pairs = new List<KeyValuePair<string, string>>
                        {
                            new KeyValuePair<string, string>( "grant_type", "password" ), 
                            new KeyValuePair<string, string>( "userName", userName ), 
                            new KeyValuePair<string, string> ( "password", password )
                        };
            var content = new FormUrlEncodedContent(pairs);
            using (var client = new HttpClient())
            {
                var response = 
                    client.PostAsync("https://localhost:12698/Token", content).Result;
                return response.Content.ReadAsStringAsync().Result;
            }
        }

答案 1 :(得分:0)

我现在无法自己测试,但我认为您错过了authCredentials中的某些文字。它应该是这样的:

var authCredentials = "grant_type=password&userName=" + user + "&password=" + password;

请注意我在开头添加的附加内容: grant_type = password&amp; 。此更新的整个字符串authCredentials应该是您请求正文中的唯一内容。

假设请求成功并且由于其他原因它没有失败,例如您的用户名或密码无效,那么您应该能够取回您的令牌数据。

此外,响应将在其正文中的json格式字符串中包含access_token,而不是在您正在阅读它的Cookie标头中。