如何将自定义数据传递给HandleChallengeAsync函数

9
我有一个Web API,它采用自定义身份验证方案来读取身份验证令牌。由于身份验证可能失败(401),原因可能有很多(令牌丢失、无效或过期),因此我想在HTTP响应中指示失败原因。例如:401 令牌已过期
令牌是在AuthenticationHandler<T>.HandleAuthenticateAsync中解析和验证的。如何将失败原因从该方法传递到HandleChallengeAsync
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
  AuthenticateResult result = null;
  var tokenResult = this.ParseToken(this.Request, out var token);

  if (tokenResult == TokenResult.Normal)
  {
    result = AuthenticateResult.Success(this.ticketFactory.CreateAuthenticationTicket(token));
  }
  else
  {
    result = AuthenticateResult.Fail("Bad token");
    // FIXME: Figure out how to populate the Properties property
    //result.Properties.Items.Add(nameof(TokenResult), tokenResult.ToString());
  }

  return Task.FromResult(result);
}

AuthenticationProperties.Items看起来是保存这种自定义数据的好地方,但我不知道如何在HandleAuthenticateAsync中创建一个AuthenticationProperties对象,并将其附加到AuthenticateResult对象上。有什么方法吗?

1个回答

4

2
在处理程序类上添加一个字段,从HandleAuthenticateAsync分配它,并从HandleChallengeAsync中使用它。 - juunas
1
在 .NET GitHub 仓库整合后,源代码位于此处:https://github.com/dotnet/aspnetcore/blob/main/src/Security/Authentication/Core/src/AuthenticationBuilder.cs#L48。 - Martin Žid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接