Не удается получить токен веб-API asp.net с помощью http-клиента

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

[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 отвечает как ПЛОХОЙ запрос. Я попытался добавить тип контента как «application/json» и подтвердил с помощью fiddler, что запрос имеет тип json.

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

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

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


person varun    schedule 14.11.2013    source источник


Ответы (2)


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

var response = client.PostAsync("Token", new StringContent("grant_type=password&username=xxx&password=xxx1234", Encoding.UTF8)).Result;
person E-Cheng Liu    schedule 15.11.2013

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

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","P@ssW@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; }
}
person K. R.    schedule 29.03.2016