我一直在尝试设置两个(最终更多).NET Core 2.0 API。
将处理身份验证,创建声明并将其存储在Cookie中的人。理想情况下,其他人应该使用相同的cookie来授予对授权端点的访问权。
但我遇到了一些问题,第二项服务没有识别 - 或使用 - 我在auth服务中创建的cookie。
我的Startup.cs文件(对于这两种服务)看起来像这样......
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.Cookie = new CookieBuilder { Name = ".AuthCookie", Domain = "localhost", SecurePolicy = CookieSecurePolicy.SameAsRequest, SameSite = SameSiteMode.Lax, HttpOnly = false }; // Events // On redirect to login, return 401 options.Events.OnRedirectToLogin = (context) => { context.Response.StatusCode = 401; return Task.CompletedTask; }; // On access denied, return 403 options.Events.OnRedirectToAccessDenied = (context) => { context.Response.StatusCode = 403; return Task.CompletedTask; }; }); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseAuthentication(); app.UseMvc(); }
出于测试目的,我创建了一个用于创建声明的HttpGet调用,因此端点看起来像这样......
[HttpGet] [Route("login")] public async Task Login() { // Generate the list of claims // TODO: Generate claims based on data from post var claims = new List { new Claim(ClaimTypes.NameIdentifier, "identifier"), new Claim(ClaimTypes.Name, "name") }; // Create the claims identity var identity = new ClaimsIdentity(claims, "login"); // Initialize the principal var principal = new ClaimsPrincipal(identity); // Sign in using the principal await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal); // Return the all-clear return Ok("Logged in"); }
总而言之,创建此cookie的服务可以使用它,但其他服务很难看到您应该进行身份验证。
这两个服务都在docker容器中运行,如果它是相关的,并且可以通过localhost域访问,如下所示:http://localhost:{ServicePort}
由于我无法找到任何有用的文档,因此我无法找到任何有用的文档,大多数关于cookie共享的文章似乎早于.NET Core 2.0中的当前实现
非常感谢任何关于我可能做错的提示。
由Evk提供,我必须启用服务AddDataProtection并将其密钥保存在两个(或所有)服务都可以访问的文件系统上。
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"/appdata"));