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)