Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit f06ee9e

Browse files
added end session
1 parent ab8074a commit f06ee9e

File tree

3 files changed

+69
-8
lines changed

3 files changed

+69
-8
lines changed

src/IdentityModel.OidcClient/AuthorizeClient.cs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,25 @@ public async Task<AuthorizeResult> AuthorizeAsync(DisplayMode displayMode = Disp
6868
return result;
6969
}
7070

71+
public async Task EndSessionAsync(LogoutRequest request)
72+
{
73+
var endpoint = _options.ProviderInformation.EndSessionEndpoint;
74+
if (endpoint.IsMissing())
75+
{
76+
throw new InvalidOperationException("Discovery document has no end session endpoint");
77+
}
78+
79+
var url = CreateEndSessionUrl(endpoint, request);
80+
81+
var browserOptions = new BrowserOptions(url, _options.PostLogoutRedirectUri ?? string.Empty)
82+
{
83+
Timeout = TimeSpan.FromSeconds(request.BrowserTimeout),
84+
DisplayMode = request.BrowserDisplayMode
85+
};
86+
87+
var browserResult = await _options.Browser.InvokeAsync(browserOptions);
88+
}
89+
7190
public AuthorizeState CreateAuthorizeState(object extraParameters = null)
7291
{
7392
_logger.LogTrace("CreateAuthorizeStateAsync");
@@ -82,26 +101,42 @@ public AuthorizeState CreateAuthorizeState(object extraParameters = null)
82101
CodeVerifier = pkce.CodeVerifier,
83102
};
84103

85-
state.StartUrl = CreateUrl(state.State, state.Nonce, pkce.CodeChallenge, extraParameters);
104+
state.StartUrl = CreateAuthorizeUrl(state.State, state.Nonce, pkce.CodeChallenge, extraParameters);
86105

87106
_logger.LogDebug(LogSerializer.Serialize(state));
88107

89108
return state;
90109
}
91110

92-
internal string CreateUrl(string state, string nonce, string codeChallenge, object extraParameters)
111+
internal string CreateAuthorizeUrl(string state, string nonce, string codeChallenge, object extraParameters)
93112
{
94-
_logger.LogTrace("CreateUrl");
113+
_logger.LogTrace("CreateAuthorizeUrl");
95114

96-
var parameters = CreateParameters(state, nonce, codeChallenge, extraParameters);
115+
var parameters = CreateAuthorizeParameters(state, nonce, codeChallenge, extraParameters);
97116
var request = new AuthorizeRequest(_options.ProviderInformation.AuthorizeEndpoint);
98117

99118
return request.Create(parameters);
100119
}
101120

102-
internal Dictionary<string, string> CreateParameters(string state, string nonce, string codeChallenge, object extraParameters)
121+
internal string CreateEndSessionUrl(string endpoint, LogoutRequest request)
103122
{
104-
_logger.LogTrace("CreateParameters");
123+
var parameters = new Dictionary<string, string>();
124+
125+
if (request.IdTokenHint.IsPresent())
126+
{
127+
parameters.Add(OidcConstants.EndSessionRequest.IdTokenHint, request.IdTokenHint);
128+
}
129+
if (_options.PostLogoutRedirectUri.IsPresent())
130+
{
131+
parameters.Add(OidcConstants.EndSessionRequest.PostLogoutRedirectUri, _options.PostLogoutRedirectUri);
132+
}
133+
134+
return new AuthorizeRequest(endpoint).Create(parameters);
135+
}
136+
137+
internal Dictionary<string, string> CreateAuthorizeParameters(string state, string nonce, string codeChallenge, object extraParameters)
138+
{
139+
_logger.LogTrace("CreateAuthorizeParameters");
105140

106141
string responseType = null;
107142
switch (_options.Flow)
@@ -173,8 +208,10 @@ private Dictionary<string, string> ObjectToDictionary(object values)
173208
return null;
174209
}
175210

176-
var dictionary = values as Dictionary<string, string>;
177-
if (dictionary != null) return dictionary;
211+
if (values is Dictionary<string, string> dictionary)
212+
{
213+
return dictionary;
214+
}
178215

179216
dictionary = new Dictionary<string, string>();
180217

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
4+
5+
using IdentityModel.OidcClient.Browser;
6+
7+
namespace IdentityModel.OidcClient
8+
{
9+
public class LogoutRequest
10+
{
11+
public DisplayMode BrowserDisplayMode { get; set; } = DisplayMode.Visible;
12+
public int BrowserTimeout { get; set; } = 300;
13+
14+
public string IdTokenHint { get; set; }
15+
}
16+
}

src/IdentityModel.OidcClient/OidClientOptions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ public class OidcClientOptions
6464
/// </value>
6565
public string RedirectUri { get; set; }
6666

67+
/// <summary>
68+
/// Gets or sets the post logout redirect URI.
69+
/// </summary>
70+
/// <value>
71+
/// The post logout redirect URI.
72+
/// </value>
73+
public string PostLogoutRedirectUri { get; set; }
74+
6775
/// <summary>
6876
/// Gets or sets the browser implementation.
6977
/// </summary>

0 commit comments

Comments
 (0)