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)