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);
}