我尝试在 WebAPI 的第一个方法中存储会话,并从第二个方法获取它。我正在使用
HttpContext.Session.SetString
,并且在我的状态文件中包含了所需的 app.useSession
和 services.AddDistributedMemoryCache()
、services.AddSession()
方法。
问题是,我的第一个方法的返回类型为“RedirectResult”,并且它正在执行
new Redirect("http:// ...")
然后当我尝试运行第二种方法时,会话为空。我认为是因为第一种方法中发送到浏览器的会话 cookie 标头被重定向覆盖了。
那么我该怎么做呢?我正在尝试存储 code_verifier 字符串(用于 OAuth PKCE 实现),然后重定向到 OAuth 代码请求端点
看来我最初的怀疑是错误的;这与重定向无关。
当 OAuth 服务器重定向回我的第二个 WebAPI 的方法时,它通过 POST 执行此操作。出于某种原因,cookies(包括 与我尝试在浏览器中通过普通 GET 发出请求时不同,
AspNetCore.Session
cookie)没有被发送...
我确实看到
AspNetCore.Session
cookie 的 SameSite 设置为 LAX。
那么我该怎么做呢?
当请求通过 POST 来自第 3 方时,“LAX”cookie 不允许被继承。
通过将 .NET Core 会话 cookie 的 SameSite 属性设置为“None”解决了该问题。这还要求将安全标志设置为“true”并且 WebAPI 通过 HTTPS 运行。
必须从浏览器中手动删除之前的会话 cookie 才能生效。
services.AddSession(options =>
{
options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
});
services.AddSession();