Authentication 为什么浏览器要求我使用ASP.NET Core 3.1登录

Authentication 为什么浏览器要求我使用ASP.NET Core 3.1登录,authentication,asp.net-web-api,Authentication,Asp.net Web Api,我已经用ASP.NETCore3.1、MVC和API创建了一个网站。该网站共有两个部分。一个经典的静态网站(带有主页、关于、联系页面等)和一个SPA应用程序。您需要登录才能使用SPA应用程序 我相信我的auth方法相当“标准”。(没有不同的权限或角色) 用户登录,并创建一个仅HTTP的cookie。它们被重定向到网站的Web API部分 任何对C#Web API的API调用,前端都会检查返回状态代码(如代码200或500等) 如果返回值为401,则假定JWT已过期或从未创建过。然后,前端再次调用

我已经用ASP.NETCore3.1、MVC和API创建了一个网站。该网站共有两个部分。一个经典的静态网站(带有主页、关于、联系页面等)和一个SPA应用程序。您需要登录才能使用SPA应用程序

我相信我的auth方法相当“标准”。(没有不同的权限或角色)

用户登录,并创建一个仅HTTP的cookie。它们被重定向到网站的Web API部分

任何对C#Web API的API调用,前端都会检查返回状态代码(如代码200或500等)

如果返回值为401,则假定JWT已过期或从未创建过。然后,前端再次调用Web Api以检索新的Json Web令牌。如果返回JWT,程序将使用有效的JWT再次尝试原始请求。否则,它会通过向用户发出问题警报来处理这种情况

ajax代码看起来像

function toDatabase(type, url, data, successDelegate, failDelegate, errorDelegate, tryAgainIfUnathorized) {
    $.ajax({
        type: type.toUpperCase(),
        url: url,
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + bearerToken.get()
        },
        data: data,
        dataType: "json",
        success: function (response) {
            successDelegate(response);
        },
        error: function (e) {

            if (e.status === 401 && tryAgainIfUnathorized) { 
                const callback = function () {
                    toDatabase(type, url, data, successDelegate, failDelegate, errorDelegate, false, false);
                };
                bearerToken.refresh(callback);//try to get the updated token, then retry the original request
            }
            else {
                if (e.status !== 200)
                    errorDelegate(e.statusText);

                console.log("Error in ajaxCall.js. Expand for call stack:");
                console.log(e);
            }

        }
    });
这在我的本地计算机上运行良好

问题是,在我的制作网站上,谷歌浏览器偶尔会出现一个登录对话框,这似乎是随机的,但并不经常。我的代码不创建此对话框。我甚至不知道创建它的javascript:)

我不明白。如果我单击“取消”,那么我可以按照自己的意愿继续(这意味着我已通过身份验证)

我读了一遍,这似乎是因为浏览器检测到401并试图提供帮助

我曾试图通过返回499而不是401来回避这个问题,但这给代码带来了更多的麻烦

jwtBearerOptions.Events = new JwtBearerEvents
{                                
    OnAuthenticationFailed = context =>
    {
        context.Response.OnStarting(() =>
        {
            context.Response.StatusCode = 499;
            return Task.CompletedTask;
         });

         return Task.CompletedTask;
                            }
     };

如何防止此对话框显示(或者我使用JWT的方法不正确)

任何更新?面对同样的问题。丑陋的做法是让它过期。您可以更改返回代码,但这是其他问题附带的。您是如何更改返回代码的,如果可以共享和解释,请将其作为下面的答案共享。TIA:-)代码在我的帖子里?