ASP.NET Core 5 OpenIdConnect 身份验证 cookie 理论上是如何工作的?

问题描述 投票:0回答:2

我们正在尝试了解身份验证 cookie(ASP.NET Core 5.0 -

Microsoft.AspNetCore.Authentication.OpenIdConnect
版本 5.0.11)如何在没有 PKCE 的情况下与授权代码流配合使用。

授权流程

身份验证过程如下所示:前端中的登录重定向到

AuthController
的登录端点并启动 OpenId Connect 过程。因此,您已通过身份提供商的身份验证,并且为用户设置了 cookie。每次调用 API 时都会发送这些信息,以检查请求是否经过身份验证。

在此过程中创建了 3 个 cookie:

饼干#1:

  • 名称 = .AspNetCore.Cookies
  • 值=块-2

饼干#2:

  • 名称 = .AspNetCore.CookiesC1
  • 值 = CfDJ8GRK-GHfascFTvp0o_E7oKZU-6GOAbUGCPHZZPfewEv12PmKgr46gfeTQC351e-Jnxq8SxzjJEgboIedIPCO11Q […]

饼干#3:

  • 名称 = .AspNetCore.CookiesC2
  • 值 = 8G86qN27NOS2Z-75XqY34d-ID1nOELpPaHUIe2EkFZMmfjrYSKA2JaU30p4Ozh8RyxZXTpFCRV8

问题

  • 这些
    .AspNetCore
    cookie 如何用于身份验证?
  • 名称是如何生成的,值是如何加密的?
  • 这些 cookie 包含什么?

我们尝试解密 cookie(如何手动解密 ASP.NET Core 身份验证 cookie?)以了解它是如何工作的,但这对我们不起作用。

不幸的是,理论上我们还没有找到关于 cookie 是如何生成(带有名称和值)的答案。

我希望这些问题是可以理解的,如果有人能回答这些问题,我将不胜感激。

代码片段以便更好地理解。希望:)

AuthController

// https://auth0.com/blog/backend-for-frontend-pattern-with-auth0-and-dotnet/
public class AuthController : Controller
{
    public ActionResult Login(string returnUrl = "/login")
    {
        return new ChallengeResult(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties() { RedirectUri = returnUrl });
    }

    [Authorize]
    public async Task<ActionResult> Logout()
    {
        await HttpContext.SignOutAsync();

        return new SignOutResult(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties
        {
            //RedirectUri = Url.Action("Index", "Home")
            RedirectUri = "/logout"
        });
    }

    //[Authorize]
    public ActionResult GetUser()
    {
        var jsonReturn = new Dictionary<string, string>();

        if (User != null && User.Identity.IsAuthenticated)
        {
            jsonReturn.Add("isAuthenticated", "true");

            foreach (var claim in ((ClaimsIdentity)this.User.Identity).Claims)
            {
                jsonReturn.Add(claim.Type, claim.Value);
            }

            return Json(JsonConvert.SerializeObject(jsonReturn));
        }

        jsonReturn.Add("isAuthenticated", "false");
        return Json(JsonConvert.SerializeObject(jsonReturn));
    }
}

启动:

public void ConfigureServices(IServiceCollection services)
{
     JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

     services.AddAuthentication(options =>
     {
          options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
          options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
          options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     })
     .AddCookie(o =>
     {
          o.Cookie.SecurePolicy = CookieSecurePolicy.Always;
          o.Cookie.SameSite = SameSiteMode.Strict;
          o.Cookie.HttpOnly = true;
     })
     .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options => ConfigureOpenIdConnect(options));
}

private void ConfigureOpenIdConnect(OpenIdConnectOptions options)
{
        options.Authority = <identity provider url>;
        options.ClientId = "<clientId>";
        options.ClientSecret = "<clientSecret>";

        options.ResponseMode = OpenIdConnectResponseMode.FormPost;
        options.Scope.Clear();
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("offline_access");
        
        options.CallbackPath = new PathString("/callback");
        options.SaveTokens = true;
        options.UseTokenLifetime = false;
}
c# asp.net-core authentication cookies openid-connect
2个回答
1
投票

.AspNetCore cookie 由 Cookie 身份验证处理程序在用户使用 OpenIDConnect 处理程序成功进行身份验证(受到质询)后创建。

如果 Cookie 大小太大,则会将其分成 4Kb 的块,以确保 Cookie 不会被浏览器或代理拒绝。

Cookie 中的数据使用数据保护 API 进行加密,并且您可以通过一些努力使用数据保护 API 解密 Cookie 的内容。

cookie 中的数据主要包含您的 ClaimsPrincipal(用户对象)及其各种声明。您也可以选择将 openid-connect 令牌存储在 cookie 中。

希望这能回答您的问题。

ps,如果您想查看饼干内部,那么我在这里有一篇关于此的博客文章:https://nestenius.se/2023/11/22/exploring-what-is-inside-the-asp-net -核心饼干/

我还写了一篇博文,更多地讨论了会话存储的目的以及它如何提高安全性: 通过减少 Cookie 来提高 ASP.NET Core 安全性


0
投票

这是一个多么优秀的标题啊!感谢您的解释和分享。

© www.soinside.com 2019 - 2024. All rights reserved.