Browse Source

fix: fixed `select_account` Incorrect callback path

pull/1470/head
colin 5 months ago
parent
commit
47b1ee677b
  1. 52
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Pages/Account/SelectAccount.cshtml.cs

52
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Pages/Account/SelectAccount.cshtml.cs

@ -25,6 +25,7 @@ public class SelectAccountModel : AccountPageModel
private const string LastLoginTimeFieldName = "LastLoginTime"; private const string LastLoginTimeFieldName = "LastLoginTime";
private const string AllowedTenantsFieldName = "AllowedTenants"; private const string AllowedTenantsFieldName = "AllowedTenants";
public const string DefaultDateFormat = "yyyy-MM-dd HH:mm:ss"; public const string DefaultDateFormat = "yyyy-MM-dd HH:mm:ss";
private OriginalRequestInfo _originalRequest;
[BindProperty(SupportsGet = true)] [BindProperty(SupportsGet = true)]
public string RedirectUri { get; set; } public string RedirectUri { get; set; }
@ -62,8 +63,8 @@ public class SelectAccountModel : AccountPageModel
}); });
} }
var requestInfo = await ParseOriginalRequestFromRedirectUriAsync(); _originalRequest = await ParseOriginalRequestFromRedirectUriAsync();
if (requestInfo == null) if (_originalRequest == null)
{ {
Alerts.Warning(L["InvalidSelectAccountRequest"]); Alerts.Warning(L["InvalidSelectAccountRequest"]);
return Page(); return Page();
@ -71,12 +72,12 @@ public class SelectAccountModel : AccountPageModel
Input = new SelectAccountInput Input = new SelectAccountInput
{ {
RedirectUri = requestInfo.RedirectUri, RedirectUri = _originalRequest.RedirectUri,
ClientId = requestInfo.ClientId, ClientId = _originalRequest.ClientId,
}; };
var application = await ApplicationManager.FindByClientIdAsync(requestInfo.ClientId); var application = await ApplicationManager.FindByClientIdAsync(_originalRequest.ClientId);
ClientName = await ApplicationManager.GetLocalizedDisplayNameAsync(application) ?? requestInfo.ClientId; ClientName = await ApplicationManager.GetLocalizedDisplayNameAsync(application) ?? _originalRequest.ClientId;
var currentUser = await UserManager.GetUserAsync(User); var currentUser = await UserManager.GetUserAsync(User);
if (currentUser == null) if (currentUser == null)
@ -84,13 +85,13 @@ public class SelectAccountModel : AccountPageModel
await SignInManager.SignOutAsync(); await SignInManager.SignOutAsync();
return RedirectToPage("/Account/Login", new return RedirectToPage("/Account/Login", new
{ {
ReturnUrl = requestInfo.RedirectUri ReturnUrl = _originalRequest.RedirectUri
}); });
} }
UserName = currentUser.UserName; UserName = currentUser.UserName;
AvailableAccounts = await DiscoverUserAccountsAsync(currentUser, requestInfo.ClientId); AvailableAccounts = await DiscoverUserAccountsAsync(currentUser, _originalRequest.ClientId);
if (AvailableAccounts.Count == 0) if (AvailableAccounts.Count == 0)
{ {
@ -182,9 +183,40 @@ public class SelectAccountModel : AccountPageModel
// Clear the dynamic claims cache. // Clear the dynamic claims cache.
await IdentityDynamicClaimsPrincipalContributorCache.ClearAsync(user.Id, user.TenantId); await IdentityDynamicClaimsPrincipalContributorCache.ClearAsync(user.Id, user.TenantId);
} }
// ÖØ¶¨Ïò»ØÔ­Ê¼ÊÚȨÇëÇó // ÖØ¶¨Ïò»ØÔ­Ê¼ÊÚȨÇëÇó
return await RedirectSafelyAsync(Input.RedirectUri); var originalAuthorizeUrl = await ReconstructOriginalAuthorizeUrlAsync();
return Redirect(originalAuthorizeUrl);
}
protected async virtual Task<string> ReconstructOriginalAuthorizeUrlAsync()
{
if (_originalRequest == null)
{
return Input.RedirectUri;
}
// 构建完整的授权请求 URL
var authorizeUrl = "/connect/authorize";
var parameters = new Dictionary<string, string>
{
["client_id"] = _originalRequest.ClientId,
["redirect_uri"] = _originalRequest.RedirectUri,
["response_type"] = _originalRequest.ResponseType ?? "code",
["scope"] = _originalRequest.Scope,
["state"] = _originalRequest.State,
["code_challenge"] = _originalRequest.CodeChallenge,
["code_challenge_method"] = _originalRequest.CodeChallengeMethod,
["prompt"] = "none" // 用户已认证,不需要再次提示
};
// 添加可选的 nonce 参数
if (!string.IsNullOrEmpty(_originalRequest.Nonce))
{
parameters["nonce"] = _originalRequest.Nonce;
}
return QueryHelpers.AddQueryString(authorizeUrl, parameters);
} }
protected virtual Task<OriginalRequestInfo> ParseOriginalRequestFromRedirectUriAsync() protected virtual Task<OriginalRequestInfo> ParseOriginalRequestFromRedirectUriAsync()

Loading…
Cancel
Save