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 AllowedTenantsFieldName = "AllowedTenants";
public const string DefaultDateFormat = "yyyy-MM-dd HH:mm:ss";
private OriginalRequestInfo _originalRequest;
[BindProperty(SupportsGet = true)]
public string RedirectUri { get; set; }
@ -62,8 +63,8 @@ public class SelectAccountModel : AccountPageModel
});
}
var requestInfo = await ParseOriginalRequestFromRedirectUriAsync();
if (requestInfo == null)
_originalRequest = await ParseOriginalRequestFromRedirectUriAsync();
if (_originalRequest == null)
{
Alerts.Warning(L["InvalidSelectAccountRequest"]);
return Page();
@ -71,12 +72,12 @@ public class SelectAccountModel : AccountPageModel
Input = new SelectAccountInput
{
RedirectUri = requestInfo.RedirectUri,
ClientId = requestInfo.ClientId,
RedirectUri = _originalRequest.RedirectUri,
ClientId = _originalRequest.ClientId,
};
var application = await ApplicationManager.FindByClientIdAsync(requestInfo.ClientId);
ClientName = await ApplicationManager.GetLocalizedDisplayNameAsync(application) ?? requestInfo.ClientId;
var application = await ApplicationManager.FindByClientIdAsync(_originalRequest.ClientId);
ClientName = await ApplicationManager.GetLocalizedDisplayNameAsync(application) ?? _originalRequest.ClientId;
var currentUser = await UserManager.GetUserAsync(User);
if (currentUser == null)
@ -84,13 +85,13 @@ public class SelectAccountModel : AccountPageModel
await SignInManager.SignOutAsync();
return RedirectToPage("/Account/Login", new
{
ReturnUrl = requestInfo.RedirectUri
ReturnUrl = _originalRequest.RedirectUri
});
}
UserName = currentUser.UserName;
AvailableAccounts = await DiscoverUserAccountsAsync(currentUser, requestInfo.ClientId);
AvailableAccounts = await DiscoverUserAccountsAsync(currentUser, _originalRequest.ClientId);
if (AvailableAccounts.Count == 0)
{
@ -182,9 +183,40 @@ public class SelectAccountModel : AccountPageModel
// Clear the dynamic claims cache.
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()

Loading…
Cancel
Save