ASP.NET 核心 Azure AD 授权问题(chrome 不保存 cookie 并发出循环请求)
ASP.NET core Azure AD authorization problem (chrome doesn't save cookies and makes loop requests)
我正在尝试将 azure AD 添加到我的项目中并使用 this 教程作为示例。
使用 localhost 一切正常,但部署后出现循环重定向 chrome(版本 91)
Also i get this problem using last version of opera and edge. While doing the same in safari and Firefox i didn't get any problems.
等问题
我认为这可能是同站点 cookie 的问题,但我已经尝试了每一种变体(none、松散、未指定、严格)。我还注意到,在 Firefox 中响应 Cookies 我收到“AspNetCore.Cookies 而在 Chome 中我没有。
但在 chrome 中它只是这些
有人可以帮我解决这个问题吗?
我的启动文件
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.HandleSameSiteCookieCompatibility();
});
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.RoleClaimType = "roles";
});
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
appsettings.json
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "11111111-1111-1111-1111-111111111111",
"ClientId": "11111111-1111-1111-1111-111111111112",
"CallbackPath": "/signin-oidc"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
这是一个修复程序(它可能不是最好的,但对我来说效果很好)。
MDN spec 说:“出现警告是因为任何请求 SameSite=None 但未标记为安全的 cookie 都将被拒绝。”这是我在 Chromium 引擎 (Chrome/Opera/Edge) 上使用浏览器 运行 的问题。默认值是 CookieSecurePolicy.SameAsRequest
我将其更改为 CookieSecurePolicy.Always
:
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.CorrelationCookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
options.NonceCookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
});
chrome中的部分警告截图:
之前
之后
我正在尝试将 azure AD 添加到我的项目中并使用 this 教程作为示例。
使用 localhost 一切正常,但部署后出现循环重定向 chrome(版本 91)
Also i get this problem using last version of opera and edge. While doing the same in safari and Firefox i didn't get any problems.
等问题
我认为这可能是同站点 cookie 的问题,但我已经尝试了每一种变体(none、松散、未指定、严格)。我还注意到,在 Firefox 中响应 Cookies 我收到“AspNetCore.Cookies 而在 Chome 中我没有。
但在 chrome 中它只是这些
有人可以帮我解决这个问题吗?
我的启动文件
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.HandleSameSiteCookieCompatibility();
});
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.RoleClaimType = "roles";
});
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
appsettings.json
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "11111111-1111-1111-1111-111111111111",
"ClientId": "11111111-1111-1111-1111-111111111112",
"CallbackPath": "/signin-oidc"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
这是一个修复程序(它可能不是最好的,但对我来说效果很好)。
MDN spec 说:“出现警告是因为任何请求 SameSite=None 但未标记为安全的 cookie 都将被拒绝。”这是我在 Chromium 引擎 (Chrome/Opera/Edge) 上使用浏览器 运行 的问题。默认值是 CookieSecurePolicy.SameAsRequest
我将其更改为 CookieSecurePolicy.Always
:
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.CorrelationCookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
options.NonceCookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
});
chrome中的部分警告截图:
之前
之后