authentication - ASP.NET Core 3.1 - AddJwtBearer、OnTokenValidated 事件在失败时不考虑自定义消息

标签 authentication .net-core jwt startup

如果请求中提供了不记名 token ,我有一个场景需要重新创建委托(delegate)人。为此,我使用 OnTokenValidated 事件来执行一些自定义逻辑(如果持有者有效)。我检查用户电子邮件是否经过验证,如果是,我将自定义声明添加到用户身份,然后我可以稍后在同一请求期间访问它,并使用 Controller 和操作上的授权属性。

但是,如果电子邮件未经过验证,我会尝试返回一条自定义消息,但我会不断收到“未经授权”的回复,即使此代码已被点击并使用首选消息也是如此。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority = customDomain;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateAudience = true,
                    ValidAudiences = audiences,
                    ValidateIssuer = true,
                    ValidIssuers = issuers
                };

                options.Events = new JwtBearerEvents
                {
                    OnTokenValidated = async (context) =>
                    {
                        var user = context.Principal;

                        //Check if already restored during current request
                        if (user.GetDefaultUserPrincipal() == null)
                        {
                            var securityManager = context.HttpContext.RequestServices.GetRequiredService<ISecurityManager>();
                            var authResponse = await securityManager.AuthenticateMarketplaceFromBearerRequestAsync(user);

                            if(!authResponse.IsAuthenticated)
                            {
                                context.Fail(authResponse.Message);
                            }
                        }
                    }
                };
            });

我是不是漏掉了什么?我也试过抛出异常并在 AuthenticationFailed 事件中处理该响应,但我得到了同样的结果。

或者,我正在尝试创建一个自定义策略来执行此检查,只要我仍然可以返回自定义响应消息即可。

最佳答案

为了在身份验证失败时显示您的自定义消息,您可以将其写入 AuthenticationFailedContext 上下文 对象的响应。

...

if (!authResponse.IsAuthenticated){
  // set the content-type of the response
  context.Response.ContentType = "application/json";

  // prepare your custom data
  var data = new { MyCustomMessage = authResponse.Message };

  // user serializer to form your data to string. Here I used Newtonsoft.Json
  var jsonResult = JsonConvert.SerializeObject(data);

  // Write the jsonresult to the response. Make sure this returns a Task
  context.Response.WriteAsync(jsonResult);
}

...

关于authentication - ASP.NET Core 3.1 - AddJwtBearer、OnTokenValidated 事件在失败时不考虑自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65351526/

相关文章:

java - Adhaar 卡 API

ruby-on-rails-3 - Ruby on Rails with Sorcery 重置密码电子邮件出现未定义方法错误

jquery - 使用 jQuery 将额外数据附加到页面中的每个链接

c# - 类型 'Object' 在未被 .Net Core 项目引用的程序集中定义

asp.net-mvc - 发布应用程序时的 .Net Core React SPA 路由问题

ios - phonegap for ios 中的 facebook 身份验证

c# - 如何在 .NET Core 中使用 .sdf 文件

node.js - 如何在node.js后端和Angular 2前端中使用jwt实现社交登录

security - JWT RS256、RS384、RS512 算法有什么区别?

javascript - Firebase:通过 REST 获取 token 并使用 signInWithCustomToken