最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

asp.net core - IdentityServer Common Signout not working - Stack Overflow

programmeradmin2浏览0评论

this task is very complex to me but using google, chatGPT I done this project but I figure out some issues.
In localhost everything working fine but when its come to production server getting issue.
Signout Issue working in localhost but its not working in Production Server(Windows Server 2022). I tried all the solutions provided by Google, StackOverflow, and Codemaze, but still my problem was not sorted out. I have a requirement to bring multiple MVC applications into one umbrella, i.e., Sigle-Sign-On, using IdentityServer 6. The login part is working fine, but when it comes to signout, its not working.

1. IdentityServer Project:

public class SD
{
    private static IConfiguration _configuration;

    public static void SetConfig(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    public static IEnumerable<IdentityResource> IdentityResources =>
        new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Email(),
            new IdentityResources.Profile(),
        };

    public static IEnumerable<ApiScope> ApiScopes =>
        new List<ApiScope>
        {
            new ApiScope("User1","Web App Client Access"),
            new ApiScope("User2","Web App Client Access"),
            new ApiScope("User3","Web App Client Access")
        };

    public static IEnumerable<Client> Clients()
    {
        // Fetch all SSO keys and values
        var ssoUrls = _configuration.GetSection("SSO").GetChildren()
                                    .Select(x => x.Value)
                                    .ToList();

        string AfterSignoutRedirectToLogin = _configuration.GetValue<string>("SSO:SSOLogin");

        var redirectUris = ssoUrls.Select(url => $"{url}/signin-oidc").ToList();
        var postLogoutRedirectUris = ssoUrls.Select(url => $"{url}/signout-callback-oidc").ToList();

        var clients = new List<Client>
        {
            
            new Client
            {
                ClientId="User1",
                ClientSecrets = { new Secret("secret_By_user1".Sha256()) },
                AllowedGrantTypes = GrantTypes.Code,
                AllowedScopes = { "User1", IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile,
                  IdentityServerConstants.StandardScopes.Email,
                  JwtClaimTypes.Role,"api1"},
                RedirectUris = redirectUris,
                PostLogoutRedirectUris = postLogoutRedirectUris,
                // Back-Channel Logout (Triggers Logout via Server-to-Server Call)
                BackChannelLogoutUri = $"{_configuration["SSO:User1"]}/Account/BackChannelLogout",
                BackChannelLogoutSessionRequired = true,
                FrontChannelLogoutUri = $"{_configuration.GetValue<string>("SSO:User1")}/Account/FrontChannelLogout",
                FrontChannelLogoutSessionRequired = true

            },
            new Client
            {
                ClientId="User2",
                ClientSecrets = { new Secret("secret_By_user2".Sha256()) },
                AllowedGrantTypes = GrantTypes.Code,
                AllowedScopes = { "User2", IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile,
                  IdentityServerConstants.StandardScopes.Email,
                  JwtClaimTypes.Role,"api1"},
                RedirectUris = redirectUris,
                PostLogoutRedirectUris = postLogoutRedirectUris,
                // Back-Channel Logout (Triggers Logout via Server-to-Server Call)
                BackChannelLogoutUri = $"{_configuration["SSO:User2"]}/Account/BackChannelLogout",
                BackChannelLogoutSessionRequired = true,
                FrontChannelLogoutUri = $"{_configuration.GetValue<string>("SSO:User2")}/Account/FrontChannelLogout",
                FrontChannelLogoutSessionRequired = true
            },
            new Client
            {
                ClientId="User3",
                ClientSecrets = { new Secret("secret_By_user3".Sha256()) },
                AllowedGrantTypes = GrantTypes.Code,
                AllowedScopes = { "User3", IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile,
                  IdentityServerConstants.StandardScopes.Email,
                  JwtClaimTypes.Role,"api1"},
                RedirectUris = redirectUris,
                PostLogoutRedirectUris = postLogoutRedirectUris,
                // Back-Channel Logout (Triggers Logout via Server-to-Server Call)
                BackChannelLogoutUri = $"{_configuration["SSO:User3"]}/Account/BackChannelLogout",
                BackChannelLogoutSessionRequired = true,
                FrontChannelLogoutUri = $"{_configuration.GetValue<string>("SSO:User3")}/Account/FrontChannelLogout",
                FrontChannelLogoutSessionRequired = true
            }
        };
        return clients;
    }

    public static bool IsValidUri(string uri)
    {
        return Uri.TryCreate(uri, UriKind.Absolute, out var uriResult)
               && (uriResult.Scheme == Uri.UriSchemeHttp
                   || uriResult.Scheme == Uri.UriSchemeHttps);
    }

}
public class ProfileService : IProfileService
{
    private readonly IUserClaimsPrincipalFactory<ApplicationUser> _userClaimsPrincipalFactory;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly RoleManager<IdentityRole> _roleManager;
    public ProfileService(IUserClaimsPrincipalFactory<ApplicationUser> userClaimsPrincipalFactory, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
    {
        _userClaimsPrincipalFactory = userClaimsPrincipalFactory;
        _userManager = userManager;
        _roleManager = roleManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        string sub = context.Subject.GetSubjectId();
        ApplicationUser user = await _userManager.FindByIdAsync(sub);
        ClaimsPrincipal userClaims = await _userClaimsPrincipalFactory.CreateAsync(user);
        List<Claim> claims = userClaims.Claims.ToList();
        claims = claims.Where(u => context.RequestedClaimTypes.Contains(u.Type)).ToList();
        // Adding claims individually
        claims.Add(new Claim(JwtClaimTypes.Name, user.UserName));
        claims.Add(new Claim(JwtClaimTypes.Email, user.Email));
        claims.Add(new Claim("OrgId", user.Organization.ToString()));
        claims.Add(new Claim("FirstName", user.FirstName));
        claims.Add(new Claim("LastName", user.LastName));
        claims.Add(new Claim(JwtClaimTypes.GivenName, user.FirstName));
        claims.Add(new Claim(JwtClaimTypes.MiddleName, user.LastName));
        if (_userManager.SupportsUserRole)
        {
            var roles = await _userManager.GetRolesAsync(user);
            foreach (var roleName in roles)
            {
                claims.Add(new Claim(JwtClaimTypes.Role, roleName));
            }
        }

        context.IssuedClaims = claims;
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        string sub = context.Subject.GetSubjectId();
        ApplicationUser user = await _userManager.FindByIdAsync(sub);
        context.IsActive = user != null;
    }
}

and I'm not adding the entire program.cs file code:

// Fetch all SSO keys and values
var ssoUrls = builder.Configuration.GetSection("SSO").GetChildren()
                                   .Select(x => x.Value)
                                   .ToArray();

if (ssoUrls == null || ssoUrls.Length == 0)
{
    throw new InvalidOperationException("No SSO URLs found in configuration.");
}

// Add CORS policy
builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.WithOrigins(ssoUrls)
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials();
    });
});
builder.Services.AddIdentityServer(options =>
{
    options.Endpoints.EnableEndSessionEndpoint = true;
    options.Events.RaiseErrorEvents = true;
    options.Events.RaiseInformationEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.Events.RaiseSuccessEvents = true;
    options.EmitStaticAudienceClaim = true;
})
.AddInMemoryIdentityResources(SD.IdentityResources)
.AddInMemoryApiScopes(SD.ApiScopes)
.AddInMemoryClients(SD.Clients())
.AddAspNetIdentity<ApplicationUser>()
.AddDeveloperSigningCredential()
.AddProfileService<ProfileService>();
//its working only after register in IdentityServer
builder.Services.AddScoped<IProfileService, ProfileService>();
// the below code added to handle - http, https issue - 26-12-2024
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
var client = new HttpClient(handler);
// the below code added to handle signin key validation - 26-12-2024
builder.Services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(Directory.GetCurrentDirectory(), "keys")))
    .SetApplicationName("InsiteApp");

builder.Services.AddSingleton<ICorsPolicyService>((container) => {
    var logger = container.GetRequiredService<ILogger<DefaultCorsPolicyService>>();
    return new DefaultCorsPolicyService(logger)
    {
        AllowedOrigins = ssoUrls.ToList()
    };
});

builder.Services.ConfigureApplicationCookie(options =>
{
    options.AccessDeniedPath = new PathString("/Account/AccessDenied");
    options.LoginPath = "/Account/Login";
    options.LogoutPath = "/Account/Logout";
    options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    options.Cookie.MaxAge = options.ExpireTimeSpan;
    options.SlidingExpiration = true;
});

and in identityserver logout page code I'm placing here:

public async Task<IActionResult> OnGet(string? logoutId)
{
    try
    {
        LogoutId = logoutId;

        var showLogoutPrompt = LogoutOptions.ShowLogoutPrompt;

        // see if we need to trigger federated logout
        var idp = User.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;
        // raise the logout event
        await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));
        Telemetry.Metrics.UserLogout(idp);

        // if it's a local login we can ignore this workflow
        if (idp != null && idp != Duende.IdentityServer.IdentityServerConstants.LocalIdentityProvider)
        {
            // we need to see if the provider supports external logout
            if (await HttpContext.GetSchemeSupportsSignOutAsync(idp))
            {
                // build a return URL so the upstream provider will redirect back
                // to us after the user has logged out. this allows us to then
                // complete our single sign-out processing.
                var url = Url.Page("/Account/Logout/Loggedout", new { logoutId = LogoutId });

                // this triggers a redirect to the external provider for sign-out
                return SignOut(new AuthenticationProperties { RedirectUri = url }, idp);
            }
        }

        if (User.Identity?.IsAuthenticated != true)
        {
            // if the user is not authenticated, then just show logged out page
            showLogoutPrompt = false;
        }
        else
        {
            var context = await _interaction.GetLogoutContextAsync(LogoutId);
            if (context?.ShowSignoutPrompt == false)
            {
                // it's safe to automatically sign-out
                showLogoutPrompt = false;
            }
        }
        
        if (showLogoutPrompt==false)
        {
            _signManager.SignOutAsync();
            await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
            return Redirect("/Account/Login?ReturnUrl=" + logoutId);
        }

    }
    catch (Exception ex)
    {
        _logger.LogError($"error occured in logout onGet functinality,\nException: {ex.Message}");
        _logger.LogInformation($"error occured in logout onGet functinality,\nException: {ex.Message}");
    }
    return Redirect("/Account/Login?ReturnUrl=" + logoutId);
}

and this is my appsettings.json file code:

 "SSO": {
   "SSOLogin": "https://localhost:7006/Account/Login",
   "User1": "https://localhost:7002",
   "User2": "https://localhost:7188",
   "User3": "https://localhost:7061"
 }

MVC Application 1 : (User1) I just posting only Program.cs file code only becuase all the configuration are declared here only.

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    options.Cookie.Name = "_UserCookies";
    options.Cookie.SameSite = SameSiteMode.Lax;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
    options.SlidingExpiration = true;
})
.AddOpenIdConnect(options =>
{
    options.Authority = builder.Configuration["SSOServer:Login"];
    options.ClientId = "User1";
    options.ClientSecret = "secret_By_user1";
    options.ResponseType = "code";

    options.Scope.Clear();
    options.Scope.Add("User1");
    options.Scope.Add("openid");
    options.Scope.Add("profile");

    options.MapInboundClaims = false;
    options.DisableTelemetry = true;
    
    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    options.UseTokenLifetime = false;
    options.TokenValidationParameters.NameClaimType = "name";
    options.TokenValidationParameters.RoleClaimType = "role";
    options.TokenValidationParameters.ValidateIssuer = true;
    options.RequireHttpsMetadata = false;
    options.ClaimActions.MapJsonKey("sid", "sid");
    options.ClaimActions.MapJsonKey("sub", "sub");
    options.ClaimActions.MapJsonKey("role", "role");
    options.ClaimActions.MapJsonKey("access_token", "access_token");
    options.ClaimActions.MapJsonKey("id_token", "id_token");


    options.Events = new OpenIdConnectEvents
    {
        OnTokenValidated = async context =>
        {
            var expiresAt = context.Properties.GetTokenValue("expires_at");
            var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>();
            logger.LogInformation($"Token expires at: {expiresAt}");
        },
        OnRedirectToIdentityProviderForSignOut = async context =>
        {
            var logoutUri = builder.Configuration["SSOServer:Login"]+"/Account/Logout"; // Add this to your appsettings.json
            var idToken = await context.HttpContext.GetTokenAsync("id_token"); // Get id_token

            if (!string.IsNullOrEmpty(idToken))
            {
                context.ProtocolMessage.IdTokenHint = idToken; // Pass id_token hint
            }

            context.ProtocolMessage.PostLogoutRedirectUri = builder.Configuration["SSOServer:Login"] + "/Account/Logout";
            context.ProtocolMessage.State = context.Properties.RedirectUri;
            await Task.CompletedTask;
        },
        OnRemoteFailure = context =>
        {
            context.Response.Redirect("/");
            context.HandleResponse();
            return Task.FromResult(0);
        }
    };
    options.BackchannelHttpHandler = new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true
    };
});
builder.Services.AddAuthorization();

and mvc application appsettings.json file code:

"SSOServer": {
  "Login": "https://localhost:7006",
  "User1": "https://localhost:7002"
}

in my mvc application AccountController.cs file

public async Task<IActionResult> Signout()
{
    // Retrieve ID token for logout request
    var idToken = await HttpContext.GetTokenAsync("id_token");

    // Construct the IdentityServer logout URL
    var logoutUri = $"{_configuration["SSOServer:Login"]}/connect/endsession";

    if (!string.IsNullOrEmpty(idToken))
    {
        logoutUri += $"?id_token_hint={idToken}";
    }
    //Cookies
    List<string> cookiesList = HttpContext.Request.Cookies.Select(x => x.Key).ToList();
    if (cookiesList.Count > 0)
    {
        foreach (var cookieName in cookiesList)
        {
            if (HttpContext.Request.Cookies[cookieName] != null)
            {
                var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.StartsWith(cookieName));
                foreach (var cookie in siteCookies)
                {
                    _logger.LogInformation(cookie.Key);
                    Response.Cookies.Delete(cookie.Key);
                }
            }
        }
    }

    // Redirect to IdentityServer for global logout
    return SignOut(new AuthenticationProperties
    {
        RedirectUri = logoutUri
    }, OpenIdConnectDefaults.AuthenticationScheme, CookieAuthenticationDefaults.AuthenticationScheme);
}

[HttpGet]
public IActionResult FrontChannelLogout()
{
    _logger.LogInformation("User FrontChannelLogout Calling");
    if (User.Identity.IsAuthenticated)
    {
        return SignOut(new AuthenticationProperties { RedirectUri = "/" }, CookieAuthenticationDefaults.AuthenticationScheme);
    }

    return NoContent(); // Nothing to log out
}
[HttpPost]
public async Task<IActionResult> BackChannelLogout([FromForm] string sid)
{
    var userSessionId = HttpContext.User.FindFirst("sid")?.Value;
    var role = HttpContext.User.FindFirst("role")?.Value;
    _logger.LogInformation("User BackChannelLogout Calling");
    //Cookies
    List<string> cookiesList = HttpContext.Request.Cookies.Select(x => x.Key).ToList();
    if (cookiesList.Count > 0)
    {
        foreach (var cookieName in cookiesList)
        {
            if (HttpContext.Request.Cookies[cookieName] != null)
            {
                var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.StartsWith(cookieName));
                foreach (var cookie in siteCookies)
                {
                    _logger.LogInformation(cookie.Key);
                    Response.Cookies.Delete(cookie.Key);
                }
            }
        }
    }

    // Clear local authentication session
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
    
    return Ok();
}

Simillarly same code implementation in other User2, User3 application also... its working good in my local deployment but when I deployed in Window Server Operting System i.e Production Server Single-Signout not working.

Logs:
2025-02-10T14:27:48.2943411+05:30 0HNA9M3LP0JI9:00000001 [INF] Invoking IdentityServer endpoint: "Duende.IdentityServer.Endpoints.EndSessionEndpoint" for "/connect/endsession" (f7642de5) 2025-02-10T14:27:48.3181022+05:30 0HNA9M3LP0JI9:00000001 [WRN] Invalid PostLogoutRedirectUri: "https://localhost:7006/Account/Logout" (13fd5159) 2025-02-10T14:27:48.3212985+05:30 0HNA9M3LP0JI9:00000001 [INF] End session request validation success EndSessionRequestValidationLog { ClientId: "User1", ClientName: null, SubjectId: "c7753b37-528a-4015-bad1-f8730ca7223a", PostLogOutUri: null, State: null, Raw: [("post_logout_redirect_uri": "https://localhost:7006/Account/Logout"), ("id_token_hint": "REDACTED"), ("state": "CfDJ8JKy4l3fcFBMnwm50IhRI7eCItzUC2-a0wvwrODoJ5HPHCCklXS-6F957Jpsb9OOdFKvKnuarOcG2dGeS4oiIftpOcO2FkLokYW4rlAfbRaMFFjGgxvkmTxHVH5ePxNq4f5Z8zcSsdJsSweeW_2zx8OA_PF1pfm2Fo2KticBq53-Bi5J8FB7B9apE3Z711-vvLiXudLCkvbex922RirPBVJrvziSHHfMJgMTWcI4-7ZDgTMTzRj5XUIQuNzTcRTVzRDZp2cQvtYdiZ8GYGa_6JcNpY1ii6nJgu5ojsTgvBy9YyJZL48RNH9coGU8G3HNJ1H2L0Ha1PXTjToclKsreK1cEDvoSOFk4iAWQbRmHnAzVoA37OzPhhJ2hXy46BGhqI9c3w7XX8P-mvG2knz7xVgrCYLobZTBl2E-n_ARU3_UWwKeH9-YasMJ78QaSH7t-cERv7mqNXHKzmnmAvaGrV82eOp0S83P_GsmSD-2HC-WTspQX19aXXyINNRCjacNMAEYoWavVMamr-kXLQnZ6xCSLD6Q81PRlSshA_jt7kyTnEhMVd9DBAp7FJSmd0HVPQjDGUEEIe7ntM0kHYPvBlxbGcRBdujaWDKTdRneAPIelJFZ87Z9gRG_52ljVGgRtQ_vh2_XFZnWQ0VMZv39RHOBJFN40yGue8HAtLD6ewss6KpalNvMqz_awwqA9ybE_zzSfqr2GfeNWsb72U3TbikN2fY8egp8Gs5QkfnDBtOVdX1Y2oUNDxP3jChj7Ue2eSgen7VqYyVuUWy6ege3Jl0WJG7_HbEPY8hwGeAOYwiQQ3m4hpDduatSMdbgw_GxYjXkjWewShpj2tRJR-YLPcj2GLKF5RdaksnlzRuQiuIQYhJ1X5kmRKqamHKQ-Mh-9bDd23kFTT3HN7hURwdmauoE2ihWIaGQkKqDIAoXXaJxhJsYgN-jgcDUdmyaTI2SRnlPX1opsZbDAQLp716U-3vNcrAEqAW9SwgZrmACT8TL2dvasjKzf_K0O4fy7HO4BQg_0cjkXujlxq0RihPB-H-WEN-geIgvDgzcIJGbyisjZh0X2kVy56V3tBhQ5nLV9-QaflNlpp42gY-s17mEpKTTku3_ifp7-M22oDny-HkJCWWLmS2PBkXRg_uVARdLc_ybzEa_3Fy3_rftgPBy7c8i_rXUFSbefhA2ucwr3bphpuySm1McmyypAbiZZyMtgRLXPdClFpSOu1BRCmTCDnp3YhVNnPe9hO83bySu9dUMzY3_ABujMbtFvr5qiURTbOA7YieL6X1nXzdIHLEOkv7hle8X2WgmkTA24M1xsx_C2XOIeyuWgUtBYLJgHHJem9_4ASybCmMDYpyRS9mayFPwU2fgn0qR-F1uvfNnlcXHKAtaeOr2VB7DgErE5DSGRRuv8S7nFm5ghGDkfq0cbEk7l0-bZC4E88TYO9iy9i2y9Dz3EwnNJoP23sPHHBKT05s_mqX2uSNLkvTFezfO_4qJvcQCX8AxsEL0DcuPL3dWh52X7NmvAdJ5BuMZB-N_tl6GB2q84h9ljzGGqlTNL2DkMtTdNVS3HfggM9HoGyW6XJxfQcyycbrjpBirhZwHvIc9DaEpgWBfQX3oO1aNxzpbboOnR6iJrDfIAmuTiDikekYe23emsTbCSiKQ9Dh40x8rWvUfloIN0LxCwAOTIwO3sly8Q6iukfuL9Wqaveu8b3Qj6AY8CGcCAbiZl8n4tLvPSvEiRLVbHrZURzEEzl-tdfb_ozdJGvxHyyWfDjTdwwSt1P58f-m2H5kgIqnsAyhzPhCxKgDhkPCQkVcledDluZDJqk8A3Z20_GZ_gUn6pXXgKzN4K33XuuL01O0A58Xoyh0WeJuzliD1FasHTFoXpBvBlf79r72EARFV1wxEhmbU1BsFYyhrnMFXt3T1XvkiX3RvQe3iC44OGQtCRbF3pL0oF2a32ObsJ8vPu0AaHVZ3lyrwocjJE_tOv7wpXilDy3JP4m_MteYUmhW_o-iWnXHppnn7d-upAVGQUCvwUr0fPjmYfCFXJ2yoaRk3qcuPfM64voHZPMiwlezfUSr7_ewIttV_K9jgYNvVKM6eXSFqVu_Ll2ayYZ5SzmUYg8EZyxg7ViFHT0YuSL4UoOi8VrnCzjTxj9PQSvpSXcLNgSOIQVQj1OJPFQNUcZtS9SSYwIKaRBewlPgYVFLIIW4XmBNvj4JtyFBnECpjtB-P-46UUP2sllyZouzBw5fFeTbIcpS1jfYZpfp33hu2z1hwX26IiG5xAjNC_r6OlHtS2nbrKPPYSiDRxVZ88NX_EQNrYEXQ7y_7KrBKlpMwz4_wyDroVJIU4mkjglYuyny__GDlea4BxAD4fM5Xo59mCPWNogTDFrN4VZdCrfzf3w8Qkci9wfotDrSV9M4tKrxUQFJuPjls7IYBCEpdhAHn8K1pwvP6pc37zQixMS6GR3-i2VAN4JxGdekv5qiVY7pGSFBZ2uo93fpRqW-ISX2qlUtxLYUlIbiwxTsujl8jYYHBHyNl0G3_34JNz53tUYDbu4OffVH0llRLrB3iF2dkr34e6hh6lpAPcduWRYAp7538IFVPhIS1zuCssqD43uKn9zx0kenMMxB8onMTeweqgSfbocpRt0Eo46uyQzsoGfxX91xTiaSAjxbeqQlAUAd2uVz9I7V-wMtZ-icQIVrXtk5Q92ZmufmsQoSZuFSTZHqSpaafAfHpekD2WBm4jWTTpZx5wU8mRzkbQkdqEJT-HiP60OLtWX6SPJXeRGn7bDZRLCoKYHkCL2bhYm5RSK0kjEYBSdHKVBRG6dGdQzrJoVPkGBK9nDLfL03mndmIXou3kl9ilfDavadf59QY2VKE9pC0xb8p5kSq9SiLqnNRpybR38F3rMiq-yWaAJ4lKPrvQjIh-Xc5WHPT5PugoqYg")] } (a6ad0f1e) 2025-02-10T14:27:48.3480408+05:30 0HNA9M3LP0JI9:00000003 [INF] UserLogoutSuccessEvent { SubjectId: "c7753b37-528a-4015-bad1-f8730ca7223a", DisplayName: "[email protected]", Category: "Authentication", Name: "User Logout Success", EventType: Success, Id: 1002, Message: null, ActivityId: "0HNA9M3LP0JI9:00000003", TimeStamp: 02/10/2025 08:57:48, ProcessId: 15512, LocalIpAddress: "::1:7006", RemoteIpAddress: "::1" } (92ad9b33) 2025-02-10T14:27:48.3661420+05:30 0HNA9M3LP0JI9:00000003 [INF] Start processing HTTP request "POST" "https://localhost:7002/Account/BackChannelLogout" (338f1c77) 2025-02-10T14:27:48.3677822+05:30 0HNA9M3LP0JI9:00000003 [INF] Sending HTTP request "POST" "https://localhost:7002/Account/BackChannelLogout" (2e7ac211) 2025-02-10T14:27:48.3774467+05:30 0HNA9M3LP0JI9:00000003 [INF] Start processing HTTP request "POST" "https://localhost:5001/Account/BackChannelLogout" (338f1c77) 2025-02-10T14:27:48.3787097+05:30 0HNA9M3LP0JI9:00000003 [INF] Sending HTTP request "POST" "https://localhost:5001/Account/BackChannelLogout" (2e7ac211) 2025-02-10T14:27:48.4356203+05:30 0HNA9M3LP0JIA:00000001 [INF] Invoking IdentityServer endpoint: "Duende.IdentityServer.Endpoints.AuthorizeEndpoint" for "/connect/authorize" (f7642de5) 2025-02-10T14:27:48.4390624+05:30 0HNA9M3LP0JIA:00000001 [INF] Showing login: User is not authenticated (4b8d50b2) 2025-02-10T14:27:48.4586443+05:30 0HNA9M3LP0JI9:00000003 [INF] Received HTTP response headers after 71.6277ms - 200 (f0742c1f) 2025-02-10T14:27:48.4608233+05:30 0HNA9M3LP0JI9:00000003 [INF] End processing HTTP request after 83.0334ms - 200 (7656b38e) 2025-02-10T14:27:48.5160778+05:30 0HNA9M3LP0JI9:00000003 [INF] Received HTTP response headers after 146.881ms - 200 (f0742c1f) 2025-02-10T14:27:48.5173449+05:30 0HNA9M3LP0JI9:00000003 [INF] End processing HTTP request after 155.5452ms - 200 (7656b38e)

发布评论

评论列表(0)

  1. 暂无评论