ControllerBase类具有Challenge方法,该方法返回ChallengeResult类的对象。CookieAuthenticationOptions类具有AutomaticChallenge属性。

我相信ChallengeResult与外部登录有关。但是它实际上如何工作? “挑战”一词从何而来?这里面有什么。

最佳答案

ChallengeResult是一种ActionResult,在执行时会挑战给定的身份验证方案的处理程序。或者,如果未指定,则为默认质询方案的处理程序。 Source code for ChallengeResult

因此,例如,您可以执行以下操作:

return Challenge(JwtBearerDefaults.AuthenticationScheme); //Can specify multiple schemes + parameters

这将挑战JWT承载身份验证处理程序。
在此处理程序的情况下,它将响应状态代码设置为401,以告知调用方他们需要身份验证才能执行此操作。
AutomaticChallenge(在ASP.NET Core 1.x中)是表明这是默认质询处理程序的设置。这意味着如果没有专门命名身份验证方案,它将被调用。

在2.x中,对此进行了更改,以便您现在指定默认质询方案或更高级别的默认方案。
services.AddAuthentication(o =>
{
    o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; //Default for everything
    // o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; //Default specifically for challenges
})

挑战基本上是说“我不知道该用户是谁,请验证其身份”的一种方式。因此,如果触发了身份验证处理程序,例如Facebook身份验证处理程序,它将通过发出指向Facebook身份验证页面的重定向来应对挑战。本地帐户身份验证处理程序可能会向本地登录页面发出重定向。

在JWT Bearer身份验证的情况下,处理程序只能执行401状态码响应,而不能将其留给调用方以对其进行正确的身份验证。

您可以在Facebook身份验证使用的OAuthHandler(HandleChallengeAsync)中看到它的作用(以及Microsoft和Google身份验证)。

当您不知道用户是谁时,通常会返回一个挑战,如果您知道他们是谁,则会返回一个禁止,但不允许他们执行他们尝试执行的操作。

10-02 22:38