【问题标题】:Getting Controller Instance From TokenValidatedContext (Net Core, JwtBearerMiddleware)从 TokenValidatedContext 获取控制器实例(Net Core,JwtBearerMiddleware)
【发布时间】:2018-11-28 22:45:33
【问题描述】:

各位程序员,您好,我正在创建一个带有身份验证的 API。在OnTokenValidated 函数中,我想让我的控制器实例将声明保存在API Base Controller 中。 上下文变量是 TokenValidatedContext 并具有 HttpContext 属性,但此 HttpContext 没有常用方法(我只会使用常用方法获取 RouteData)。 我知道有很多方法可以轻松地从任何控制器访问声明,但由于原因,我需要在 ApiBaseController 中使用它。我的代码在启动时是这样的:

 options.JwtBearerEvents = new JwtBearerEvents
                {
                    OnAuthenticationFailed = context =>
                    {
                        return jwtMiddleware.AuthenticationFailed(context); 
                    }
                    ,OnMessageReceived = context =>
                    {
                        return jwtMiddleware.MessageReceived(context);
                    },
                    OnTokenValidated = context =>
                    {
                        //var claims = context.Principal.Claims.ToList();
                        return jwtMiddleware.TokenValidated(context);
                    },
                    OnChallenge = context =>
                    {
                        return jwtMiddleware.Challenge(context);
                    }
                };

也许我可以将声明保存在另一个回调函数中?我到处寻找类似的情况,但我还没有找到任何东西。 你对此有什么建议吗?帮助。 提前致谢。

【问题讨论】:

  • 为什么要把claims保存在Controller里面?它们通常保存在 Principal 对象中。
  • @Win 声明确实在主体中。我把这件事告诉了我的领导。我想我会延长任务,直到我的领导改变主意。我想我可以试一试。

标签: c# asp.net-core jwt


【解决方案1】:

就像@win 在他的评论中所说,这些声明可以在Principal 中访问。所以你应该像普通人一样使用它。

,另一方面,必须将相同的声明保存在基本控制器上。所以我做了以下事情:

  • 添加了IHttpContextAccessor 的单例实例。
  • 创建了一个模型,其中包含我将保存的声明信息。
  • 我创建了一个方法,该方法调用单例上下文及其声明并返回带有信息的模型。
  • 在基本控制器中,如果模型的实例为空,我将使用前面提到的方法分配它。

我不推荐最后一个程序,只需使用Princpal,但可以帮助其他有类似目标的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多