我一直在做多个教程,试图了解身份验证在 ASP.NET Core 中的工作原理。我了解中间件如何处理请求的一般概念;然而,我对它CookieAuthenticationMiddleware到底是如何工作的感到困惑。据我所知,它会查找 cookie,这基本上就是您的加密身份,如果存在,它将您当前的身份设置为 cookie 中的值。
如何为实际的CookieAuthenticationMiddleware. 在我看来,这个中间件只有在已经生成了可供读取的 cookie 时才有用。对我来说,您需要另一个身份验证器(例如社交登录)来设置初始 cookie。就像是:
app.UseCookieAuthenticationMiddleware(...)
app.UseFacebookAuthentication(...)
Run Code Online (Sandbox Code Playgroud)
另外,Facebook 身份验证如何设置 cookie 身份验证中间件可以识别的 cookie?文档说,一旦创建了主体(大概来自 Facebook 中间件),您就可以调用:
await HttpContext.Authentication.SignInAsync(
"MyCookieMiddlewareInstance",
principal);
Run Code Online (Sandbox Code Playgroud)
也许Facebook中间件调用这个来设置cookie,但我不太明白这个方法的作用。
我的问题基本上可以归结为两点:如何为 cookie auth 中间件创建初始 cookie,以及如何HttpContext.Authentication.SignInAsync(...)触发 cookie 中间件去创建 cookie?
谢谢!
\n\n\n如何为实际的 CookieAuthenticationMiddleware 创建原始 cookie。
\n
Cookie身份验证中间件让用户登录并创建 Cookie。cookie授权中间件查找 cookie 值。
\n\n为了说明这一点,这里有几行来自CookieAuthenticationHandler,显示了 cookie身份验证中间件设置 cookie。
Options.CookieManager.AppendResponseCookie(\n Context,\n Options.CookieName,\n cookieValue,\n cookieOptions);\nRun Code Online (Sandbox Code Playgroud)\n\n这里有几行显示DenyAnonymousAuthorizationRequirement : IAuthorizationHandler授权中间件正在寻找已添加到上下文中的 cookie 值。
var user = context.User;\nvar userIsAnonymous =\n user?.Identity == null ||\n !user.Identities.Any(i => i.IsAuthenticated);\nif (!userIsAnonymous)\n{\n context.Succeed(requirement);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n你还问了这个:
\n\n\n\n\n...Facebook 身份验证如何设置 cookie 身份验证中间件可以识别的 cookie?
\n
Facebook 身份验证是 OAuth 身份验证,这意味着它位于以下继承层次结构的底部。
\n\nIAuthenticationHandler\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 AuthenticationHandler\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CookieAuthenticationHandler\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 RemoteAuthenticationHandler\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 OAuthHandler\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 FacebookHandler \nRun Code Online (Sandbox Code Playgroud)\n\n在 Facebook OAuth 中,RemoteAuthenticationHander.HandleRemoteCallbackAsync处理 Facebook 的响应,然后调用SignInAsync.
Context.Authentication.SignInAsync(\n Options.SignInScheme, \n context.Principal, \n context.Properties);\nRun Code Online (Sandbox Code Playgroud)\n\n该调用SignInAsync就是您在问题中假设的内容。
\n\n\n...Facebook 中间件调用 [SignInAsync] 来设置 cookie,但我不太明白这个方法的作用。
\n
做什么事SignInAsync情很复杂。对 的调用发生在属性内部SignInAsync的实例上。该实例通常是. 您可以在此处查看完整的调用,这里是其中的一个片段。AuthenticationManagerContext.AuthenticationDefaultAuthenticationManagerSignInAsync
public override async Task SignInAsync(\n string authenticationScheme, \n ClaimsPrincipal principal, \n AuthenticationProperties properties)\n{\n ...\n\n var handler = HttpAuthenticationFeature.Handler;\n\n var signInContext = new SignInContext(\n authenticationScheme, \n principal, \n properties?.Items);\n\n if (handler != null)\n {\n await handler.SignInAsync(signInContext);\n }\n\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n\n换句话说,SignInAsync调用SignInAsync一个身份验证处理程序,该处理程序恰好是IAuthenticationHandler继承层次结构中的一个实例。
我们最终到达CookieAuthenticationHandler.HandleSigninAsync,它将把 cookie 附加到响应中。该 cookie 处理程序仅包含AppendResponseCookie对安全存储库中的两个调用。
protected override async Task HandleSignInAsync(SignInContext signin)\n{\n ...\n\n Options.CookieManager.AppendResponseCookie(\n Context,\n Options.CookieName,\n cookieValue,\n signInContext.CookieOptions);\n\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n\n有很多活动部件。希望这个答案能够提供足够的概述来填补缺失的部分。
\n| 归档时间: |
|
| 查看次数: |
1257 次 |
| 最近记录: |