飞扬的Blog
主页
登录
asp.net core mvc利用Cookie跨站点登录和共享Session
"date"
:
"2021-07-23 18:09:35"
"classfiy"
:
"asp.net core"
"author"
:
"飞扬"
"viewTimes"
:
213
返回
>支持库版本:net5.0 ##在实际项目中发现的问题: 1. 在调用`HttpContext.SignInAsync`之后直接取`HttpContext.User.Identity.IsAuthenticated`的值一直为`false` >原因是在`HttpContext.SignInAsync`之后必须要有一个页面完整请求的过程才能取到`HttpContext.User.Identity.IsAuthenticated`的值,意思就是登陆完毕后需要跳转到其他页面。 2. 在开发QQ OAuth2登陆时,在QQ登录之后跳转到网站验证页面,然后也是获取不到已经登陆的用户信息。 >原因同上。解决方案是在`callback`里将参数原封不动的`Redirect`到另一个控制器下,就正常了。 # Startup.cs 配置 ### 共享Session > 提示:`同项目不同子域`使用共享session即可。[点击查看如何给Area绑定二级域名](https://blog.fysmart.cn/details/20051 "点击查看如何在同一项目不同子域共享Session") ```csharp //在ConfigureServices 后面添加: services.AddSession(options => { options.Cookie.Name = ".test.session"; options.Cookie.Domain = ".localtest.com"; options.IdleTimeout = TimeSpan.FromMinutes(10); options.Cookie.HttpOnly = false; options.Cookie.IsEssential = true; }); //在Configure添加: app.UseSession(); ``` ### cookie验证权限 ```csharp //在ConfigureServices添加: //这里的SchemeName对应后台的 HttpContext.SignInAsync的参数scheme services.AddAuthentication("YourSchemeName") .AddCookie("YourSchemeName", options => { options.Cookie.Name = ".test.session"; options.Cookie.Domain = ".localtest.com"; options.AccessDeniedPath = "/user/AccessDenied"; options.LoginPath = "/user/login"; }); //在Configure添加: app.UseAuthentication(); ``` ### 跨站点(或不同项目不同子域)单点登录 ```csharp //在ConfigureServices 后面添加: services.AddDataProtection() //多个站点的ApplicationName需要一致 .SetApplicationName("TestCookieAuth") //该方法表示不自动创建密钥,此方法应该在“子站点”调用,否则每个站点都生成一个密钥的话解密结果肯定不同就无法实现单点登录 .DisableAutomaticKeyGeneration() //这里是密钥保存目录 .PersistKeysToFileSystem(new DirectoryInfo("密钥保存目录")); ```