使用 OpenID Connect 注销后强制登录并在 Blazor (.Net 6) 上设置寿命 cookie
Posted
技术标签:
【中文标题】使用 OpenID Connect 注销后强制登录并在 Blazor (.Net 6) 上设置寿命 cookie【英文标题】:Force Login after logout with OpenID Connect and set lifespan cookie on Blazor (.Net 6) 【发布时间】:2022-01-06 09:20:29 【问题描述】:我在 .Net 6 服务器上使用 Blazor,在使用 OpenID Connect to ADFS 进行身份验证后,我在注销和 cookie 方面遇到了一些问题。
第一次登录完美运行(我看到了 adfs 页面)。问题是当用户注销时,使用自定义注销页面,如果用户尝试访问受保护的页面(注销后),它可以在不登录的情况下再次访问。几秒钟后,在地址栏中,它显示在 ADFS 的调用,然后进行身份验证,但没有显示任何用户名和密码表单。每次注销后如何强制用户登录 ADFS?
对于此配置,我遵循以下示例:Blazor OpenID-Connect
另一件事是 Cookie 的时间跨度。我在 .AddCookie() 方法中尝试了一些解决方案,但没有任何成功。如何正确设置 Cookie 时间跨度(10 分钟)?
最后一个问题是/.well-known/openid-configuration。在从 Duende Identity Server 更改为这个简单的解决方案(下面的代码)之前,我无法到达这个端点。为什么?
Setup.cs 文件:
public void ConfigureServices(IServiceCollection services)
...
services.AddAuthentication(opt =>
opt.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
opt.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
)
.AddCookie()
.AddOpenIdConnect("oidc", options =>
options.Authority = "https://adfs......./adfs";
options.ClientId = "<my_ID>";
options.ClientSecret = "<my_Secret>";
options.SignInScheme = "Cookies";
options.RequireHttpsMetadata = false;
options.ResponseType = "id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.UseTokenLifetime = false;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.TokenValidationParameters = new TokenValidationParameters NameClaimType = "name" ;
options.Events = new OpenIdConnectEvents
OnAccessDenied = context =>
context.HandleResponse();
context.Response.Redirect("/");
return Task.CompletedTask;
;
);
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
...
app.UseAuthentication();
app.UseAuthorization();
Logout.cshtml
@page
@model Service.Pages.LogoutModel
@
Logout.cshtml.cs
namespace Service.Pages
public class LogoutModel : PageModel
public async Task<IActionResult> OnGetAsync()
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
return Redirect("/");
【问题讨论】:
有人能帮帮我吗? 【参考方案1】:我解决了关于 /.well-know 端点的问题。我错了服务器名,现在可以正常工作了。当您使用 Duende Identity Server 时,此配置页面与您的项目相同(例如 https://localhost:5001/.well-know/openid-configuration),但没有此路径为:
https://[your-adfs-server]/adfs/.well-known/openid-configuration
在options.Authority中配置相同。
现在仍然不确定为什么注销无法正常工作.. 可能是 ADFS 的问题。
【讨论】:
以上是关于使用 OpenID Connect 注销后强制登录并在 Blazor (.Net 6) 上设置寿命 cookie的主要内容,如果未能解决你的问题,请参考以下文章
IdentityServer4- 使用OpenID Connect添加用户身份验证(implicit)
Keycloak 及其不同的适配器是不是实现了 Openid Connect Backchannel 注销规范
ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?
AppAuth / OpenID-Connect:使用用户名和密码登录?
在结束会话 URI 中使用 IP 地址时,OpenId Connect 用户未注销(发现文档 end_session_endpoint)。使用 Gluu 身份服务器