【发布时间】:2021-06-22 21:22:33
【问题描述】:
以下代码用于检查用户的身份验证状态。如果用户通过身份验证,它会重定向到前端端点,这是一个同步的RedirectResult。如果用户不是,则需要调用HttpContext.ChallengeAsync函数,该函数返回一个Task。
public async Task<dynamic> Authorize()
{
if (HttpContext.User.Identity.IsAuthenticated)
{
return Redirect("/authorize");
}
return await ChallengeAsync();
}
public async Task<dynamic> ChallengeAsync()
{
var authenticationProperties = new AuthenticationProperties
{
RedirectUri = "/authorize",
Items =
{
{ "scheme", "oidc" },
{ "returnUrl", "/authorize" }
}
};
return HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, authenticationProperties);
}
过去几年我一直在 TypeScript Land,所以我想返回 IActionResult | Task 或 Task<IActionResult> | Task 之类的东西,但我认为这在 C# 中是不可能的。
我使用的代码是 hack。它通常可以工作,但有时(通常是第一次)会抛出错误
{"stateMachine":{"1__state":3,"t__builder":{
This SO question 说这很可能会发生,因为我没有等待应该等待的事情。我可以等待ChallengeAsync 并返回Task,但这会以我无法解开的方式混淆Authorize 函数中的类型。
【问题讨论】:
-
您正在从异步方法返回一个未等待的任务——当然它会以这种方式序列化。否则你会期待什么?将
async从ChallengeAsync中取出,如下所示:public Task<dynamic> ChallengeAsync()。然后确保调用者等待它。 -
你能不返回
ChallengeResult吗?ChallengeAsync方法返回的Task并不是要传递回浏览器/客户端。 -
在 C# 中没有像 Typescript 联合类型这样的东西。您可以使用 Task.FromResult 在重定向案例中返回已完成的任务。
-
感谢@Damien_The_Unbeliever!这条对你来说微不足道的信息对我来说似乎是无价的。当您派遣前端人员完成全栈工作时,就会发生这种情况。 ????
标签: c# asynchronous asp.net-core-webapi