【问题标题】:ASP.NET how to get claims from shared cookieASP.NET 如何从共享 cookie 中获取声明
【发布时间】:2022-10-21 11:46:02
【问题描述】:

我有几个 asp.net Web API 微服务,我想使用所谓的使用 Cookie 的单点登录操作。因此,当我登录我的身份 API 时,所有其他 API 都会知道谁登录了。

现在 - 这样做时出现了几个问题: 我正在使用这种方法(和 Identity SignInManager 方法 PasswordSignInAsync):

builder.Services.ConfigureApplicationCookie(config =>
{
    config.Cookie.Name = "Identity.Cookie";
    config.LoginPath = "/User/Login";
    config.LogoutPath = "/User/Logout";
});

...登录并生成 cookie。

现在,我搜索了如何在其他 API 之间共享这个 cookie 的主题,但我震惊地发现这个 cookie 真的被共享了。而且我没有任何特定的 cookie 共享功能。这是我在不同端口上运行的 2 个 API 的屏幕截图,它们都具有相同的 cookie。我什至比较了它们的价值和它的相同。 API 在同一个解决方案中。

现在,问题是 2 - 为什么这个 cookie 在 API 之间共享,我如何从中读取登录用户的信息(声明)?

我尝试使用具有 3 个抽象方法的 CookieHandler 抽象类。但问题是这些方法的 HttpContext 参数来自 System.Web 命名空间,而 HttpContext 属性来自 AspNetCore.Mvc。

任何建议将不胜感激,因为我不知道如何从 cookie 中获取身份。请记住,只有 Identity.API 具有 SignInManager/UserManager。

【问题讨论】:

    标签: asp.net asp.net-web-api asp.net-identity microservices


    【解决方案1】:

    您分配给登录用户的 cookie 必须包含有关用户声明和用户可以访问的范围的信息。

    • 一般情况下,用户在登录后会获得一个或多个包含 access_token 的 cookie,其中包含他/她可以访问的声明和范围的数据。
    • 登录后,当用户调用 api 时,此访问令牌包含在请求的标头中,因此 api 将在 asp.net 中间件管道中提取信息,然后检查此请求是否授权使用资源。

    如果你正在使用身份服务器, 在客户端配置集中AlwaysIncludeUserClaimsInIdToken = true并且用户的声明可以从存储在访问令牌中的配置文件中访问。我不知道您是否正在使用身份服务器,所以我不能更进一步。如果您仅使用身份实现,请查看使用 Oauth 的 api 安全性。

    【讨论】:

    • 对不起,伙计,但我不使用 OpenID Connect 类型的安全性。目前,我只依赖 Cookie Auth。所以基本上,我所有记录的用户信息都在 cookie 本身中。我无法从 cookie 中提取数据。我已经阅读了许多 cmets,但我对这个问题仍然有一些了解。
    • 除此之外 - 是的 - 我的 cookie 充满了所需的信息。正如我所说,我只需要提取它。
    【解决方案2】:

    您可以获得共享 cookie 的使用CookieAuthenticationEvents. 为此,您应该继承CookieAuthenticationEvents, 并使用 cookie 上下文参数覆盖任何方法,例如登录中方法。

    您还应该将作用域派生类添加到IServiceCollection, 并将其添加到CookieAuthenticationOptions 事件类型

            services.AddAuthentication(IdentityConstants.ApplicationScheme)
                .AddCookie(IdentityConstants.ApplicationScheme, o =>
                {
                    o.LoginPath = "/login";
                    o.EventsType = typeof(CustomCookieAuthenticationEvents);
                    o.Cookie.Name = ".AspNet.SharedCookie";
                    o.Cookie.Domain = Configuration["DataProtection:SubDomain"];
                });
    
            services.AddScoped<CustomCookieAuthenticationEvents>();
    

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 1970-01-01
      • 2020-06-02
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多