Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP Net核心Web API不';无法识别会话数据_C#_Asp.net_Session_Controller - Fatal编程技术网

C# ASP Net核心Web API不';无法识别会话数据

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设置为“

我目前正在从事一个项目,该项目由一个简单的前端(作为一个HTML页面)和一个ASP.NET核心后端(Web API)组成。我目前正在进行注册/登录过程。登录方法由GET请求触发,注册方法由POST请求触发。register方法为会话cookie设置四个值,我们称它们为valA、valB、valC和valD。然后,使用login方法获取相应的值。到目前为止,我已经尝试了以下解决方案来实现这一点:

  • 修改CookiePolicyOptions以绕过同意检查,并将SamesItemPolicy设置为“无”
  • 应用赛义德·库克政策
  • 检查用户控制器是否有错误-到目前为止没有任何错误
更新

有几个因素导致了上述情况。首先,正如标记的答案所暗示的,cookie被发送到客户端,但没有返回。这个问题有几个原因。第一个问题是,我的HTML javascript代码正在发送登录请求。可以通过在客户端添加以下代码并将以下函数设置为登录按钮的OnClickHandler来解决此问题:

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。