可以在两个 .Net Core 2.0 应用程序之间共享身份验证 cookie 吗?

Bal*_* Th 6 c# asp.net authentication cookies asp.net-core-2.0

我一直在尝试设置两个(最终更多).NET Core 2.0 API。

一种处理身份验证、创建声明并将它们存储在 cookie 中的程序。理想情况下,其他人应该使用相同的 cookie 来授予对授权端点的访问权限。

然而,我遇到了一些问题,第二个服务没有识别 - 或使用 - 我在身份验证服务中创建的 cookie。

我的 Startup.cs 文件(对于这两个服务)看起来像这样......

    public void ConfigureServices(IServiceCollection 服务)
    {
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
            {
                options.Cookie = 新的 CookieBuilder
                {
                    Name = ".AuthCookie",
                    域 = "本地主机",
                    SecurePolicy = CookieSecurePolicy.SameAsRequest,
                    SameSite = SameSiteMode.Lax,
                    HttpOnly = 假
                };

                // 事件
                // 在重定向到登录时,返回 401
                options.Events.OnRedirectToLogin =(上下文)=>
                {
                    context.Response.StatusCode = 401;
                    返回 Task.CompletedTask;
                };

                // 拒绝访问,返回 403
                options.Events.OnRedirectToAccessDenied =(上下文)=>
                {
                    context.Response.StatusCode = 403;
                    返回 Task.CompletedTask;
                };
            });

        服务.AddMvc();
    }

    公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment 环境)
    {
        app.UseAuthentication();

        app.UseMvc();
    }

出于测试目的,我创建了一个用于创建声明的 HttpGet 调用,因此该端点看起来像这样......

    [HttpGet]
    [路线(“登录”)]
    公共异步任务登录()
    {
        // 生成声明列表
        // TODO:根据帖子中的数据生成声明
        var 声明 = 新列表
        {
            new Claim(ClaimTypes.NameIdentifier, "identifier"),
            新索赔(ClaimTypes.Name,“名称”)
        };

        // 创建声明标识
        var identity = new ClaimsIdentity(claims, "login");

        // 初始化主体
        var principal = new ClaimsPrincipal(identity);

        // 使用主体登录
        等待 HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, 主体);

        // 返回全部清除
        return Ok("已登录");
    }

所以总的来说,创建此 cookie 的服务可以使用它,但其他服务很难看到您应该通过身份验证。

如果相关,这两个服务都在 docker 容器中运行,并且可以通过 localhost 域访问,如下所示: http://localhost:{ServicePort}

我不知所措,因为我找不到任何有用的文档,而且大多数关于 cookie 共享的文章似乎早于 .NET Core 2.0 中的当前实现

任何关于我可能做错的提示将不胜感激。

解决方案

正如Evk提供的那样,我必须启用服务AddDataProtection并将它们的密钥保存在两个(或所有)服务都可以访问的文件系统上。

services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"/appdata"));
Run Code Online (Sandbox Code Playgroud)