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
🙂