C# 从Xamarin表单请求web API中的JWT时收到错误的请求

C# 从Xamarin表单请求web API中的JWT时收到错误的请求,c#,xamarin.forms,asp.net-web-api2,C#,Xamarin.forms,Asp.net Web Api2,因此,我制作了一个使用JSON web令牌进行身份验证的web API,但是,我还无法使用xamarin表单应用程序中的HttpClient进行身份验证。奇怪的是,我可以在为测试而开发的控制台应用程序上毫无问题地连接,控制台应用程序和xamarin forms应用程序使用几乎完全相同的代码 控制台应用程序中的代码如下所示: public static async Task<AutenticacionModel> PostCredentialsAsync(string UserName

因此,我制作了一个使用JSON web令牌进行身份验证的web API,但是,我还无法使用xamarin表单应用程序中的HttpClient进行身份验证。奇怪的是,我可以在为测试而开发的控制台应用程序上毫无问题地连接,控制台应用程序和xamarin forms应用程序使用几乎完全相同的代码

控制台应用程序中的代码如下所示:

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();
}
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})

请尝试以下代码:

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";
之前使用(var-client…
)尝试添加此行:

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

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


奇怪的是,所有代码似乎都一样。尝试使用Fiddler或Charles之类的工具查看每种情况下的情况。这可能有助于了解发生了什么。@GeraldVersluis我也有同样的想法,但我无法配置Fiddler来捕获我的请求,至少我放置了一个指示“仅显示以下主机”的筛选器:;但是会话不会在从模拟器或设备运行的Fiddler中捕获?如果是设备,则应将设备的代理设置为运行Fiddler的计算机。在模拟器上,除非您使用HTTPS@GeraldVersluis我正在从设备运行。谢谢。我将研究如何在Android但是,它现在正在工作。我不知道我到底更改了什么,我只是从控制台应用程序复制/粘贴了代码。它可能与网络有关吗?不工作。我必须以“application/x-www-form-urlencoded”的形式发送请求
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"));