使用 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的主要内容,如果未能解决你的问题,请参考以下文章

OpenID Connect - 如何处理单次注销

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 身份服务器