Получение неверного запроса при запросе JWT в веб-API из форм Xamarin - PullRequest
0 голосов
/ 03 июля 2018

Итак, я создал веб-API, который аутентифицируется с помощью JSON Web Tokens, однако мне не удалось аутентифицироваться с помощью HttpClient из моего приложения форм xamarin. Странно то, что я могу без проблем подключиться к консольному приложению, которое я создал для тестирования, и как консольное приложение, так и приложение форм xamarin используют практически одинаковый код.

Код в консольном приложении выглядит следующим образом:

public static async Task<AutenticacionModel> PostCredentialsAsync(string UserName, string Password)
{
    HttpClient cliente = new HttpClient();
    cliente.BaseAddress = new Uri("http://172.25.1.53:9891");
    HttpResponseMessage response = new HttpResponseMessage();
    string _result = String.Empty;
    try
    {
        string Path = cliente.BaseAddress + "oauth/secreto";
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Path);
        string autenticacion = "username=" + UserName + "&password=" + Password + "&grant_type=password";
        request.Content = new StringContent(autenticacion, Encoding.UTF8, "application/x-www-form-urlencoded");
        response = await cliente.SendAsync(request);
        response.EnsureSuccessStatusCode();
        _result = await response.Content.ReadAsStringAsync();
    }
    catch (Exception ex)
    {
        // something to do
    }
    return response.Content != null ? JsonConvert.DeserializeObject<AutenticacionModel>(_result) : new AutenticacionModel();
}

И код в формах Xamarin:

public async Task<AutenticacionDTO> GetUsuario(string email, string clave)
{
    string JSONAutenticacion;
    HttpResponseMessage response = new HttpResponseMessage();

    try
    {
        var client = new HttpClient();

        client.BaseAddress = new Uri(GlobalSetting.UrlWebApi);
        string Path = client.BaseAddress + "oauth/secreto";
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Path);
        string autenticacion = "username=" + email + "&password=" + clave + "&grant_type=password";
        request.Content = new StringContent(autenticacion, Encoding.UTF8, "application/x-www-form-urlencoded");
        response = await client.SendAsync(request);
        response.EnsureSuccessStatusCode();
        JSONAutenticacion = await response.Content.ReadAsStringAsync();
    }
    catch (Exception ex)
    {
        string sss = ex.ToString();
        return null;
    }
    return response.Content != null ? JsonConvert.DeserializeObject<AutenticacionDTO>(JSONAutenticacion) : new AutenticacionDTO();
}

Когда я использую почтальон для подключения к веб-API, который я разместил в своем локальном IIS, проблем не возникает, так же как и с консольным приложением. Но всякий раз, когда я пытаюсь подключиться к приложению Xamarin Forms, я получаю ответ 400 Bad Request.

Код, который заставляет Jwt работать, выглядит так:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var allowedOrigin = "*";
    context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });
    Seguridad _Seguridad = new fovissste.bll.Seguridad();
    LoginDTO Usuario = _Seguridad.Login(context.UserName, context.Password).FirstOrDefault();

    if (Usuario == null)
    {
        context.SetError("invalid_grant", "Usuario o contraseña incorrectos");
        return;
    }

    ClaimsIdentity oauthIdentity = new ClaimsIdentity(new ApplicationUser(context.UserName, "JWT"), new[] { new Claim(ClaimTypes.Role, "Publico") });
    var ticket = await Task.Run(() => new AuthenticationTicket(oauthIdentity, null));
    context.Validated(ticket);
}

Кто-нибудь может помочь? Это проблема с формами Xamarin? Я действительно нуждаюсь в некоторых комментариях, потому что я честно не могу видеть то, что мне не хватает. Я читал другие посты на этом сайте, которые предполагают, что это может быть проблема включения удаленных запросов на IIS или проблема CORS, но я думаю, что это обрабатывается в этой строке: context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

1 Ответ

0 голосов
/ 03 июля 2018

Попробуйте следующий код:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://172.25.1.53:9891");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    string autenticacion = "?username=" + email + "&password=" + clave + "&grant_type=password";
    HttpResponseMessage response = await client.PostAsync(client.BaseAddress + "oauth/secreto", new StringContent(autenticacion, Encoding.UTF8, "application/x-www-form-urlencoded"));

    response.EnsureSuccessStatusCode();

    string JSONAutenticacion = await response.Content.ReadAsStringAsync();
}

Какое значение Path после этой строки?

string Path = client.BaseAddress + "oauth/secreto";

Также попробуйте добавить эту строку до using (var client...:

System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

Редактировать

Изменено

HttpResponseMessage response = await client.PostAsync(client.BaseAddress + autenticacion, new StringContent(autenticacion));

до

HttpResponseMessage response = await client.PostAsync(client.BaseAddress + "oauth/secreto", new StringContent(autenticacion, Encoding.UTF8, "application/x-www-form-urlencoded"));
...