提问人:Markku Rintala 提问时间:6/16/2023 更新时间:10/12/2023 访问量:243
Keycloak注销:使用表单身份验证时如何使用C#获取id_token?
Keycloak logout: How to obtain id_token with C# when forms authentication is used?
问:
我需要更新一个使用Keycloak的应用程序,该应用程序与Keycloak 19兼容。以前,使用Keycloak 17。注销后,浏览器使用该参数重定向到应用程序登录页面。redirect_uri
由于Keycloak 19不再支持该参数,因此我需要使用and参数来实现与Keycloak 17类似的行为。到目前为止,我已将参数添加到我的注销 URL,如下所示:.但是,这会带来错误“缺少参数:”。redirect_uri
id_token_hint
post_logout_redirect_uri
post_logout_redirect_uri
https://realm/protocol/openid-connect/logout?post_logout_redirect_uri=https://my-application/UserLogin.aspx
id_token_hint
我需要帮助获取应添加到注销 URL 的参数的值。我的代码是用 C# 编写的。id_token_hint
目前,代码如下所示:UserLogin.aspx
public partial class CustomLogin : Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Check if sign out required
if (SignOut)
{
ExecuteSignOut(Request, Response);
}
else
{
ExecuteSignIn(Request, Response);
}
}
public static void ExecuteSignOut(HttpRequest request, HttpResponse response)
{
var redirectUri = request.Url.AbsoluteUri;
var signOutUri = $"{Realm}/protocol/openid-connect/logout?" +
$"post_logout_redirect_uri={HttpUtility.UrlEncode(redirectUri)}";
response.Redirect(signOutUri, false);
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
因此,最后,注销 URL 应如下所示:.https://realm/protocol/openid-connect/logout?id_token_hint=value_of_id_token&post_logout_redirect_uri=https://my-application/UserLogin.aspx
答:
0赞
Markku Rintala
10/12/2023
#1
为了回答我的问题,我这样做了:
//First, read code from request.
var code = request.QueryString["code"];
// Redirect URI was saved when user opened the sign in of the application. User was redirected to Keycloack.
var redirectUri = request.Cookies["RedirectUriCookieName"].value;
var tokens = JwtHelper.GetOAuth2TokensByCode(code, redirectUri);
var idtoken = tokens["id_token"].Value<string>();
其中 GetOAuth2TokensByCode 类似于
public static JObject GetOAuth2TokensByCode(string code, string redirectUri)
{
var targetUrl = "https://_Keycloack_URL_/auth" + "/protocol/openid-connect/token";
try
{
using (var client = new WebClient())
{
client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
var parameters = new System.Collections.Specialized.NameValueCollection
{
{ "grant_type", "authorization_code" },
{ "client_id", OAuth2ClientId },
{ "client_secret", OAuth2ClientSecret },
{ "code", code },
{ "redirect_uri", redirectUri }
};
var response = client.UploadValues(targetUrl, "POST", parameters);
var result = Encoding.UTF8.GetString(response);
return JObject.Parse(result);
}
}
catch (WebException e)
{
}
}
评论