2013-11-14 2 views
4

Я пытаюсь использовать http Client для вызова веб-API для получения токена. У меня есть одно приложение MVC и приложение веб-API. Ниже приведено действие контроллера MVC У меня есть.Невозможно получить токен asp.net Web API с помощью http-клиента

[HttpPost] 
public ActionResult Login() 
{ 
    LoginModel m = new LoginModel(); 
    m.grant_type = "password"; 
    m.username = "xxx"; 
    m.password = "xxx1234"; 
    HttpClient client = new HttpClient(); 
    client.BaseAddress = new Uri("http://localhost:51540/"); 
    var response = client.PostAsJsonAsync("Token", m).Result; 
    response.EnsureSuccessStatusCode(); 
    return View(); 
} 

Но когда я делаю запрос, API отвечает как запрос BAD. Я попытался добавить тип контента как «application/json» и подтвердил использование скрипта, что запрос имеет тип json.

Я могу зарегистрировать пользователя с помощью веб-API, поэтому на стороне WebAPI все выглядит хорошо, я использую проект по умолчанию, созданный VS2013, используя индивидуальную учетную запись и никоим образом не модифицировал API.

Я следую этому руководству http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api и пытаюсь использовать HTTP-клиент вместо скрипача.

Я буду благодарен, если кто-то помогает мне

ответ

17

TokenEndpointRequest кажется не поддерживает JSON, но вы можете использовать строку запроса

var response = client.PostAsync("Token", new StringContent("grant_type=password&username=xxx&password=xxx1234", Encoding.UTF8)).Result; 
+0

Спасибо, я сделал то же самое с использованием fomrurlencoded content – varun

1

Вот мой код от ответа & комментария выше

using (var client = new HttpClient{ BaseAddress = new Uri(BaseAddress) }) 
{ 
    var token = client.PostAsync("Token", 
     new FormUrlEncodedContent(new [] 
     { 
      new KeyValuePair<string,string>("grant_type","password"), 
      new KeyValuePair<string,string>("username",user.UserName), 
      new KeyValuePair<string,string>("password","[email protected]@rd") 
     })).Result.Content.ReadAsAsync<AuthenticationToken>().Result; 

    client.DefaultRequestHeaders.Authorization = 
      new AuthenticationHeaderValue(token.token_type, token.access_token); 

    // actual requests from your api follow here . . . 
} 

для аутентификации создан класс AuthenticationToken:

public class AuthenticationToken 
{ 
    public string access_token { get; set; } 
    public string token_type { get; set; } 
    public int expires_in { get; set; } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^