C# HandleChallengeAsync返回自定义对象

C# HandleChallengeAsync返回自定义对象,c#,authentication,.net-core,C#,Authentication,.net Core,我正在执行我的计划。我已经重写了这个方法 protected override async Task<AuthenticateResult> HandleAuthenticateAsync() 此方法返回响应正文中的“身份验证失败”字符串。 我想在响应体中返回序列化为json的自定义对象。但我不明白如何根据启动文件中指定的json格式化程序设置正确地将我的对象序列化为json字符串 我的启动文件中有以下设置 services .AddMvc(option =>

我正在执行我的计划。我已经重写了这个方法

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
此方法返回响应正文中的“身份验证失败”字符串。 我想在响应体中返回序列化为json的自定义对象。但我不明白如何根据启动文件中指定的json格式化程序设置正确地将我的对象序列化为json字符串

我的启动文件中有以下设置

services
    .AddMvc(option =>
    {
        option.EnableEndpointRouting = true;
        option.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
        options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
        options.SerializerSettings.Converters.Add(new DateTimeConverter());
        options.SerializerSettings.Converters.Add(new NullableDateTimeConverter());
    });
当然,我可以直接编写JSON.Net序列化,如下所示

string output = JsonConvert.SerializeObject(ErrorResponseDTO.CreateInvalidApiKey());
但我想使用已经调优过的json格式化程序。我可以访问json格式化程序吗?或者,也许有一种简单的方法可以根据json格式化程序将JsonResult转换为json字符串?

我遇到过,它对我帮助很大

有一个接口

它可以通过操纵 HttpResponse

接口注册在DI容器中,因此我可以访问它并通过它执行
IActionResult
。因此,我的任务已经简化,我只需要:

  • 创建对象实例。我正在创建对象
  • 创建对象实例
  • 通过
    iactionresultecutor
  • 我已经编写了实现上述步骤的扩展方法。看起来像

    public static class HttpResponseExtension
    {
        private static readonly RouteData EmptyRouteData = new RouteData();
    
        private static readonly ActionDescriptor EmptyActionDescriptor = new ActionDescriptor();
    
        public static Task WriteModelAsync<TModel>(this HttpContext context, TModel model)
        {
            var result = new ObjectResult(model)
            {
                DeclaredType = typeof(TModel)
            };
    
            var executor = context.RequestServices.GetRequiredService<IActionResultExecutor<ObjectResult>>();
    
            var routeData = context.GetRouteData() ?? EmptyRouteData;
            var actionContext = new ActionContext(context, routeData, EmptyActionDescriptor);
            return executor.ExecuteAsync(actionContext, result);
        }
    }
    
    因此,该方法返回一个自定义对象,该对象以为
    启动
    类中的控制器操作指定的全局格式写入响应体。因此,如果在
    StartUp
    类中更改格式设置,那么这些更改也将应用于身份验证层

    public static class HttpResponseExtension
    {
        private static readonly RouteData EmptyRouteData = new RouteData();
    
        private static readonly ActionDescriptor EmptyActionDescriptor = new ActionDescriptor();
    
        public static Task WriteModelAsync<TModel>(this HttpContext context, TModel model)
        {
            var result = new ObjectResult(model)
            {
                DeclaredType = typeof(TModel)
            };
    
            var executor = context.RequestServices.GetRequiredService<IActionResultExecutor<ObjectResult>>();
    
            var routeData = context.GetRouteData() ?? EmptyRouteData;
            var actionContext = new ActionContext(context, routeData, EmptyActionDescriptor);
            return executor.ExecuteAsync(actionContext, result);
        }
    }
    
    protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
    {
        await base.HandleChallengeAsync(properties);
    
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        var errorObj = ErrorResponseDTO.CreateInvalidApiKey();
    
        await Context.WriteModelAsync(errorObj);
    }