从Xamarin Forms请求Web API中的JWT时获取错误请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Xamarin Forms请求Web API中的JWT时获取错误请求相关的知识,希望对你有一定的参考价值。

所以我创建了一个使用JSON Web Tokens进行身份验证的Web API,但是,我无法使用我的xamarin表单应用程序中的HttpClient进行身份验证。奇怪的是,我可以在我用于测试的控制台应用程序上没有任何问题地连接,并且控制台应用程序和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();
}

当我使用邮递员连接到我在本地IIS中托管的Web API时,没有问题,与控制台应用程序相同。但每当我尝试连接Xamarin Forms App时,我都会收到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 Forms的问题吗?我真的需要一些评论,因为老实说我看不到我错过的东西。我已阅读本网站上的其他帖子,表明它可能是在IIS或CORS问题上启用远程请求的问题,但我认为这是在这一行处理:context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

以上是关于从Xamarin Forms请求Web API中的JWT时获取错误请求的主要内容,如果未能解决你的问题,请参考以下文章

无法反序列化当前 JSON 对象,xamarin.forms 中的错误

xamarin 表单中的 Web API 请求错误

如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串

如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串

Xamarin.Forms 中的 HttpClient 抛出“发送请求时发生错误。”

在xamarin表单中处理api请求的一个地方处理异常