从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.forms pcl 中的 Url 检索 json 字符串
如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串