• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

.net core 的 Session 保存之后为何取不到值?

吉普赛的歌 2018-07-05 11:24:38
1. Startup.cs 设置 Session 相关的内容:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace Web
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});

//Session 保存到内存
services.AddDistributedMemoryCache();
services.AddSession();

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();
app.UseCookiePolicy();
// 必须在 UseMvc 之前调用
app.UseSession();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Login}/{action=Index}/{id?}");
});
}
}
}


2. 在创建验证码图片时设置 Session, 但在登录时获取不到 Session。
        /// <summary>
/// 获取图形验证码
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult GetAuthCode()
{
string code = string.Empty;
byte[] byteArr = new VerifyCode().GetVerifyCode(out code);
HttpContext.Session.SetString("VERFIY_CODE_TOKEN", code);
return File(byteArr, @"image/png");
}

[HttpPost]
public ActionResult CheckLogin(string username, string password, string code)
{
try
{
string sessionCode = HttpContext.Session.GetString("VERFIY_CODE_TOKEN");
if (string.IsNullOrEmpty(sessionCode) || string.Compare(code, sessionCode, true) != 0)
{
throw new Exception("验证码错误,请重新输入");
}

throw new Exception("登录成功了!");
}
catch (Exception ex)
{
return Json(new AjaxResult { state = ResultType.error.ToString(), message = ex.Message });
}

}




实际断点跟踪时, 发现 Session.Id 前后都不一致了。
...全文
775 点赞 收藏 11
写回复
11 条回复
brain707 2019年05月28日
直接浏览器访问web api访问成功,,,但是用js跨域访问就访问不到了???
回复 点赞
多啦不是A梦 2019年04月24日
引用 12 楼 MagicalConch 的回复:
这个我之前遇到过,把options.CheckConsentNeeded = context => false,意思是不必经过用户cookie协议同意。 个人感觉是,首先session在写入时会返回给用户sessionid,这个id一般是存储在用户cookice或者url里在取session值的时候使用id查询的,但是上面这个一旦开启,代表着用户必须同意你才可以使用cookice技术,导致你的sessionid无法回传,后端就会认为这是一个新的会话,所以产生了新的sessionid,就取不到值了。
测试了下,设置为false好像真的能用;只是会提示不安全。
回复 点赞
多啦不是A梦 2019年04月24日
我也遇到了同样的问题,去掉的确可以,但是去掉了不知道有没有其他影响,不知道啥意思
回复 点赞
Magical&Conch 2019年03月09日
这个我之前遇到过,把options.CheckConsentNeeded = context => false,意思是不必经过用户cookie协议同意。 个人感觉是,首先session在写入时会返回给用户sessionid,这个id一般是存储在用户cookice或者url里在取session值的时候使用id查询的,但是上面这个一旦开启,代表着用户必须同意你才可以使用cookice技术,导致你的sessionid无法回传,后端就会认为这是一个新的会话,所以产生了新的sessionid,就取不到值了。
回复 点赞
changuncle 2018年12月11日
注释掉之后Session确实可以读写了,点赞。
只是不知道注释掉的内容是什么意思。
回复 点赞
朱祥 2018年08月31日
前来点赞
回复 点赞
吉普赛的歌 2018年07月05日
注: 验证码是 ajax 请求, 登录是普通提交
回复 点赞
吉普赛的歌 2018年07月05日
引用 5 楼 D56233577 的回复:
去掉

services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});

可用, 谢谢!
回复 点赞
D56233577 2018年07月05日
去掉

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
回复 点赞
tangyanzhi1111 2018年07月05日
.Net Core这样啊,
回复 点赞
正怒月神 2018年07月05日
还没用core,没办法发表意见。
但是在传统的 .net mvc里,是没有问题的。
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告