背景:前面嘗試了用https的方式解決,但是需要有域名申請的證書,否則被他保護的api被別人調用時報錯(沒找到解決方法)
嘗試:放棄https的方式,還用原來的http的方式,解決Correlation failed. Unknown location的問題,找到這個文章,asp.net core - OIDC correlation failed in Microsoft Teams authentication popup (no problems in browser) - Stack Overflow
用下面的代碼搞定:
private void CheckSameSite(HttpContext httpContext, CookieOptions options) { if (options.SameSite == SameSiteMode.None) { var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); // TODO: Use your User Agent library of choice here. if (/* UserAgent doesn’t support new behavior */) { // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1) options.SameSite = SameSiteMode.Unspecified; } } } public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.Unspecified; options.OnAppendCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); options.OnDeleteCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); }); } public void Configure(IApplicationBuilder app) { app.UseCookiePolicy(); // Before UseAuthentication or anything else that writes cookies. app.UseAuthentication(); // … }
我的代碼記錄:
public class Startup { public static IContainer AutofacContainer; public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } private void CheckSameSite(HttpContext httpContext, CookieOptions options) { if (options.SameSite == Microsoft.AspNetCore.Http.SameSiteMode.None) { var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); // TODO: Use your User Agent library of choice here. //if (/* UserAgent doesn’t support new behavior */) //{ // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1) options.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Lax; //} } } // This method gets called by the runtime. Use this method to add services to the container. public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddMvc().AddRazorRuntimeCompilation(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie(options => { options.Cookie.Name = "Cookies"; }) .AddOpenIdConnect("oidc", options => { options.SignInScheme = "Cookies"; options.Authority = "http://localhost:5000"; options.RequireHttpsMetadata = false; options.ClientId = "localMvcCore"; options.ClientSecret = "121212"; options.ResponseType = "code id_token"; options.Scope.Clear(); options.Scope.Add("openid"); options.Scope.Add("sid"); options.Scope.Add("profile"); options.Scope.Add("AuthorizationAPI"); options.SaveTokens = true; }); services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.Unspecified; options.OnAppendCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); options.OnDeleteCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); }); ContainerBuilder builder = new ContainerBuilder(); //將services中的服務填充到Autofac中. builder.Populate(services); //新模塊組件注冊 builder.RegisterModule<DefaultModuleRegister>(); //創建容器. AutofacContainer = builder.Build(); //使用容器創建 AutofacServiceProvider return new AutofacServiceProvider(AutofacContainer); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseCookiePolicy(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } }