SignInAsync vs AuthenticateAsync

我终于通过JWT令牌认证工作获得了登录方法。

我在这里打电话

await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, ClaimsPrincipalFactory.CreatePrincipal(claims), authProps); 

我也打过电话

 await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); 

在示例中,我读到我只需要SignInAsync 。 所以我测试了它并删除了AuthenticateAsync 。 但是, User.Identity.IsAuthenticated仍然返回true

是否可以删除AuthenticateAsync ? 还是我还需要它? 它为什么存在? AuthenticateAsync的文档字符串仅表示用于validation的扩展方法

以下是来自Authentification框架(针对ASP.NET Core 2.0)的所有各种方法之间的概述,按照在典型的auth流程中调用它们的顺序。

ChallengeAsync

这将指示您的浏览器在哪里进行身份validation。 例如:

  • Cookies会将您重定向到您自己的登录页面(例如/Account/Login
  • Azure AD会将您重定向到Microsoft登录页面
  • 等等..

AuthenticateAsync

此步骤处理来自validation页面(您在“挑战”步骤中重定向到的位置)的任何信息,并使用它来创建标识登录用户的ClaimsPrincipal实例。

然后将ClaimsPrincipal分配给HttpContext.User

SignInAsync

此步骤采用上ClaimsPrincipal构建的ClaimsPrincipal ,并保留它。 最常见的方式当然是cookies。

请注意,基于https://github.com/aspnet/Security/中的源代码,它似乎是保留ClaimsPrincipal的唯一方法。

SignOutAsync

这是SignIn步骤的相反步骤。 它指示中间件删除任何持久数据。

  • Cookie将删除存储的Cookie
  • Azure AD会将您重定向到其Microsoft注销页面
  • 等等..

因此,要回答您的问题,如果您已经拥有ClaimsPrincipal ,则无需调用AuthenticateAsync

事实上,在调用AuthentificateAsync之前你有一个ClaimsPrincipal 🙂