首页 > 解决方案 > 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()函数没有运行,我无法显示错误消息。

我的编码有什么问题?

标签: jqueryajaxasp.net-mvcauthenticationoauth-2.0

解决方案


推荐阅读