C# ASP Net核心Web API不';无法识别会话数据
我目前正在从事一个项目,该项目由一个简单的前端(作为一个HTML页面)和一个ASP.NET核心后端(Web API)组成。我目前正在进行注册/登录过程。登录方法由GET请求触发,注册方法由POST请求触发。register方法为会话cookie设置四个值,我们称它们为valA、valB、valC和valD。然后,使用login方法获取相应的值。到目前为止,我已经尝试了以下解决方案来实现这一点:C# ASP Net核心Web API不';无法识别会话数据,c#,asp.net,session,controller,C#,Asp.net,Session,Controller,我目前正在从事一个项目,该项目由一个简单的前端(作为一个HTML页面)和一个ASP.NET核心后端(Web API)组成。我目前正在进行注册/登录过程。登录方法由GET请求触发,注册方法由POST请求触发。register方法为会话cookie设置四个值,我们称它们为valA、valB、valC和valD。然后,使用login方法获取相应的值。到目前为止,我已经尝试了以下解决方案来实现这一点: 修改CookiePolicyOptions以绕过同意检查,并将SamesItemPolicy设置为“
- 修改CookiePolicyOptions以绕过同意检查,并将SamesItemPolicy设置为“无”
- 应用赛义德·库克政策
- 检查用户控制器是否有错误-到目前为止没有任何错误
function PostLoginRequest()
{
fetch(someUrl,{
/*
* The credentials header enables the sending
* process of the response cookie, while the
* sameSite header is used to enable the cookie
* sent accross the original domain (in this case, the HTML file)
*/
"credentials":"include",
"sameSite":"None"
});
}
此外,还必须调整Startup.cs文件的ConfigureServices方法的内容。在这种情况下,您需要添加以下新行:
// Configure a cookie policy which will be enforced by the Web API
services.Configure<CookiePolicyOptions>(options=>{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
options.Secure = CookieSecurePolicy.Always;
});
// Add a storage for the session cookies, in this case a DMC
services.AddDistributedMemoryCache();
// Configure the session cookie
services.AddSession(options=>{
// Set the name of the session cookie
options.Cookie.Name = ".App.Session";
// How long should the cookie be stored? (in this case 1 day from now)
options.IdleTimeOut = TimeSpan.FromDays(1);
// Can we bypass the consent check? (in this case : yes)
options.Cookie.IsEssential = true;
// Prevent the cookie to be accesible via Javascript
options.Cookie.HttpOnly = true;
// Allow the cookie to be sent to other domains
options.Cookie.SameSite = SameSiteMode.None;
// Sets the path of the cookie. This means on which segment of
// the domain it will be accessible. In this case, the whole domain
// is covered by the cookie
options.Cookie.Path = "/";
});
//配置将由Web API强制实施的cookie策略
配置(选项=>{
options.checkApprovered=context=>false;
options.MinimumSameSitePolicy=SameSiteMode.None;
options.Secure=CookieSecurePolicy.Always;
});
//为会话cookie添加存储,在本例中为DMC
AddDistributedMemoryCache();
//配置会话cookie
services.AddSession(选项=>{
//设置会话cookie的名称
options.Cookie.Name=“.App.Session”;
//cookie应该存储多长时间?(在这种情况下,从现在起1天)
options.IdleTimeOut=TimeSpan.FromDays(1);
//我们可以绕过同意检查吗?(在这种情况下:是)
options.Cookie.IsEssential=true;
//防止通过Javascript访问cookie
options.Cookie.HttpOnly=true;
//允许将cookie发送到其他域
options.Cookie.SameSite=SameSiteMode.None;
//设置cookie的路径。这意味着在
//该域将是可访问的。在这种情况下,整个域
//被饼干盖住了
options.Cookie.Path=“/”;
});
最后,但并非最不重要的一点是,Startup.cs应该包含函数调用app.UseSession()和app.UseCookiePolicy()。虽然第一个调用使ASP.NET核心服务器能够发送会话cookie,但如果其中存储了一些值,第二个调用将应用我们之前定义的cookie策略。这应该是目前为止的一切。很抱歉更新太长,但我希望我的解决方案描述能够帮助其他与我面临相同问题的人。如果您的HTML页面未发送Cookie,则需要重新发送Cookie。Net web api无法接收任何值。 在这里,Asp.NETWebAPI只是一个api,它无法控制html页面。
如何从HTML页面进行api调用?正在使用哪个数据库?看起来来自数据库的查询返回null。您是否使用嗅探器确定响应为空?到目前为止,没有使用任何数据库。据我所知,会话数据存储在由服务器本身组织的内存缓存中。因此,到目前为止,我没有使用任何数据库。就一般数据库使用而言,我使用一个本地MariaDB实例来存储除会话数据之外的所有数据。因此,如果丢失的数据超过了类的多个实例(或者使用新数据调用构造函数并清除旧数据),这里可能会有误解。我的会话数据不存储在包含所有会话数据的任何类中。我只是在相应的控制器内设置值并检索它们。我没有任何构造函数,只有HttpContext及其会话对象和相关方法,如GetString(x)或GetInt32(y)。然而,Rajdeep的评论可能对本案有所帮助。不过,我必须感谢您的建议:)数据必须存储在某个地方。这可能就是问题所在。我不发送任何cookie,只发送登录凭据。我认为ASP项目将自行处理这方面的问题。明天我将试用这个解决方案。谢谢你的提示,问题出在客户端没有发送cookie。