jquery - OAuth 服务提供商在无效的用户名/密码上返回 400/Bad Request
问题描述
我正在使用带有 ASP.NET MVC Web Api 项目的 OAuth 身份验证系统和 Visual Studio 2019。
以下是授权提供程序类。
public class MyAuthorizationServerProvider:OAuthAuthorizationServerProvider
{
DBContext db = new DBContext ();
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string traderid = string.Empty;
string password = string.Empty;
if(!context.TryGetBasicCredentials(out traderid,out password))
{
context.SetError("invalid_client", "Client credentials could not be retrieved");
context.Rejected();
return;
}
var trader=db.TRADERS.Where(t => t.CODE == traderid && t.PASSWORD == password).FirstOrDefault();
if (trader != null)
{
context.OwinContext.Set<TRADER>("oauth:client", trader);
context.Validated(traderid);
}
else
{
context.SetError("invalid_client", "Client credentials are invalid");
context.Rejected();
}
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var trader = db.TRADERS.Where(t => t.CODE == context.UserName && t.PASSWORD == context.Password && t.ISENABLED==true).FirstOrDefault();
if (trader == null)
{
context.SetError("invalid_grant", "Provided username and password incorrect");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Role, "USER"));
identity.AddClaim(new Claim(ClaimTypes.Name, trader.CODE));
context.Validated(identity);
}
}
我正在使用 jquery ajax 调用从 html 页面调用和验证用户名/密码。
$(document).ready(function () {
var btnLogin = $("#btnLogin");
var txtUsername = $("#txtUsername");
var txtPassword = $("#txtPassword");
btnLogin.click(function () {
var encodedData = btoa(txtUsername.val() + ":" + txtPassword.val())
$.ajax(
{
url: "http://192.168.0.3/miniapi/token",
type: "POST",
dataType: "json",
crossDomain:true,
data: { grant_type: 'password', username: txtUsername.val(), password: txtPassword.val() },
headers: {
Accept: "*/*",
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
Authorization: "Basic " + encodedData,
},
success: function (r) {
console.log(r)
},
error: function () {
$("#msg").text("Authentication failed");
}
})
});
})
当用户名/密码正确时,浏览器网络选项卡显示正确的响应(200/OK),我可以看到console.log
内部的响应success()
以及令牌和其他值。
但是当我输入错误的密码并登录时,我收到带有描述的错误消息,但在浏览器网络选项卡中显示(400/Bad Request)。所以success()
函数没有运行,我无法显示错误消息。
我的编码有什么问题?
解决方案
推荐阅读
- react-native - 尝试在 expo bundle 上导入模块时出错:无法从“components/MenuComponent.js”解析“../shared/baseUrl”
- mysql - 将 WHERE 与 COALESCE 一起使用非常慢
- android - 以编程方式更改活动主题不起作用
- ios - 我的快捷方式在手表上不起作用,仅在生产中
- gradle - 如何在 gradle.settings 的 pluginManagement 块中添加私有仓库?
- swift - 更新到 Xcode 10.2/Swift 5 后无法构建 macOS 项目
- c - 指向数组索引
- python - matplotlib 如何将图形添加到现有绘图中?
- java - 如何根据角点和单元格数计算交点
- apache-storm - Spout 完成后终止 Storm 拓扑