各位大大小的寫程式遇到一個無法解決的問題
先大概講一下我在做甚麼
使用者輸入帳密之後 系統判斷有沒有這個人 如果有 -> 跳轉頁面(並且將使用者帳號存入session) -> 跳轉頁面之後右上角會顯示剛剛session存的帳號名稱
到這邊我的程式碼大概都寫好了,
我先測試說,如果輸入成功會重新整理網頁,並且將剛剛session存的東西顯示在右上角
但是現在遇到一個問題,就是我在輸入使用者帳號密碼之後,authorize是驗證成功的,但是寫入session的時候會寫不進去,我要"再"登入一次才會寫進session裡面,我不知道為什麼第一次輸入的時候會寫不進session裡面(我是用Claim宣告的)
還請各位大大有遇過可以為小弟解答謝謝,需要補上的再麻煩跟我說~
Controller的部分
前端
public void ConfigureServices(IServiceCollection services)
{
//從組態讀取登入逾時設定
double loginExpireMinute = Configuration.GetValue("LoginExpireMinute");
// 將 Session 存在 ASP.NET Core 記憶體中
services.AddDistributedMemoryCache();
services.AddSession();
//註冊 CookieAuthentication,Scheme必填
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(option =>
{
//或許要從組態檔讀取,自己斟酌決定
option.LoginPath = new PathString("/Login/Login");//登入頁
option.LogoutPath = new PathString("/Login/Logout");//登出Action
//用戶頁面停留太久,登入逾期,或Controller中用戶登入時也可設定
option.ExpireTimeSpan = TimeSpan.FromMinutes(loginExpireMinute);//沒給預設14天
//↓資安建議false,白箱弱掃軟體會要求cookie不能延展效期,這時設false變成絕對逾期時間
//↓如果你的客戶反應明明一直在使用系統卻容易被自動登出的話,你再設為true(然後弱掃policy請客戶略過此項檢查)
option.SlidingExpiration = false;
});
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;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// 加入這幾行會出現error status 400 --------------------------------------------------------------------------------------------------
//services.AddMvc(options =>
//{
// //↓和CSRF資安有關,這裡就加入全域驗證範圍Filter的話,待會Controller不必再加上[AutoValidateAntiforgeryToken]屬性
// options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
//});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
// SessionMiddleware 加入 Pipeline
//app.Run(async (context) =>
//{
// context.Session.SetString("Sample", "This is Session.");
// string message = context.Session.GetString("Sample");
// await context.Response.WriteAsync($"{message}");
//});
//留意先執行驗證...
app.UseAuthentication();
//再執行Route,如此順序程式邏輯才正確
app.UseMvcWithDefaultRoute();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
還沒response就取值,所以取不到
所以讓你有錯覺要"再"登入一次
(有錯請糾正我)