在 Asp.Net Core 中使用 CookieAuthenticationMiddleware 登录

Rya*_*n F 3 asp.net-core

我一直在做多个教程,试图了解身份验证在 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?

谢谢!

Sha*_*tin 5

\n

如何为实际的 CookieAuthenticationMiddleware 创建原始 cookie。

\n
\n\n

Cookie身份验证中间件让用户登录并创建 Cookie。cookie授权中间件查找 cookie 值。

\n\n

为了说明这一点,这里有几行来自CookieAuthenticationHandler,显示了 cookie身份验证中间件设置 cookie。

\n\n
Options.CookieManager.AppendResponseCookie(\n    Context,\n    Options.CookieName,\n    cookieValue,\n    cookieOptions);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里有几行显示DenyAnonymousAuthorizationRequirement : IAuthorizationHandler授权中间件正在寻找已添加到上下文中的 cookie 值。

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

你还问了这个:

\n\n
\n

...Facebook 身份验证如何设置 cookie 身份验证中间件可以识别的 cookie?

\n
\n\n

Facebook 身份验证是 OAuth 身份验证,这意味着它位于以下继承层次结构的底部。

\n\n
IAuthenticationHandler\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 \n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Facebook OAuth 中,RemoteAuthenticationHander.HandleRemoteCallbackAsync处理 Facebook 的响应,然后调用SignInAsync.

\n\n
Context.Authentication.SignInAsync(\n    Options.SignInScheme, \n    context.Principal, \n    context.Properties);\n
Run Code Online (Sandbox Code Playgroud)\n\n

该调用SignInAsync就是您在问题中假设的内容。

\n\n
\n

...Facebook 中间件调用 [SignInAsync] 来设置 cookie,但我不太明白这个方法的作用。

\n
\n\n

做什么事SignInAsync情很复杂。对 的调用发生在属性内部SignInAsync的实例上。该实例通常是. 您可以在此处查看完整的调用,这里是其中的一个片段。AuthenticationManagerContext.AuthenticationDefaultAuthenticationManagerSignInAsync

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

换句话说,SignInAsync调用SignInAsync一个身份验证处理程序,该处理程序恰好是IAuthenticationHandler继承层次结构中的一个实例。

\n\n

我们最终到达CookieAuthenticationHandler.HandleSigninAsync它将把 cookie 附加到响应中。该 cookie 处理程序仅包含AppendResponseCookie对安全存储库中的两个调用。

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有很多活动部件。希望这个答案能够提供足够的概述来填补缺失的部分。

\n