gpt4 book ai didi

c# - IdentityServer4 PostLogoutRedirectUri 空

转载 作者:太空狗 更新时间:2023-10-30 00:37:48 27 4
gpt4 key购买 nike

我正在尝试让隐式流程为 IdentityServer4 工作。登录和注销工作正常,但是 PostLogoutRedirectUri 返回 null,尽管在需要设置的地方设置了值。我希望注销过程在注销完成后重定向回我的应用程序。

我正在正确获取 logoutId,注销调用 BuildLoggedOutViewModelAsync:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutInputModel model)
{
var vm = await _account.BuildLoggedOutViewModelAsync(model.LogoutId);
...

此方法位于我的 AccountService.cs 类中,然后调用 DefaultIdentityServiceInteractionService 的 GetLogoutContextAsync:

public async Task<LoggedOutViewModel> BuildLoggedOutViewModelAsync(string logoutId)
{
// get context information (client name, post logout redirect URI and iframe for federated signout)
var logout = await _interaction.GetLogoutContextAsync(logoutId);
...

创建一个 IdentityServer4.Models.LogoutRequest。

SignOutIFrameUrl 字符串属性设置为 "http://localhost:5000/connect/endsession/callback?sid=bf112f7785bc860fcc4351893012622e&logoutId=d6649e7f818d9709b2c0bc659696abdf" 但似乎没有别的已填充在 LogoutRequest 中。

不幸的是,这意味着 PostLogoutRedirectUri 为空并且 AutomaticRedirectAfterSignOut 也为空,当 LoggedOut.cshtml 页面被加载时, signout-callback.js 文件从未加载:

@section scripts
{
@if (Model.AutomaticRedirectAfterSignOut)
{
<script src="~/js/signout-redirect.js"></script>
}
}

这是我的配置设置。

配置文件:

public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "implicit.client",
AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"ContractManagerAPI"
},
RedirectUris = { "http://localhost:9000/" },
PostLogoutRedirectUris = { "http://localhost:9000/" },
AllowedCorsOrigins = { "http://localhost:9000" },
RequireConsent = false,

}
};
}

app.ts(js 客户端):

import {UserManager} from 'oidc-client';
import { inject, Factory } from 'aurelia-framework';

@inject(Factory.of(UserManager))
export class App {
userManager: UserManager;

constructor(userManagerFactory){
let config = {
authority: 'http://localhost:5000',
client_id: 'implicit.client',
response_type: 'id_token token',
scope: 'openid profile ContractManagerAPI',
redirect_uri: 'http://localhost:9000/',
post_logout_redirect_uri: 'http://localhost:9000/'
};

this.userManager = userManagerFactory(config);
}

login(){
this.userManager.signinRedirect();
}

logout(){
this.userManager.signoutRedirect();
}
}

Startup.cs的相关部分:

services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddContractManagerUserStore()
.AddProfileService<ContractManagerProfileService>();

如果能帮助我找出哪里出错了,我们将不胜感激。

谢谢!

最佳答案

将 id_token_hint 参数传递给 signoutRedirect()

可以从signinRedirect()返回的User对象中得到id_token_hint;

假设您的 ts 文件中有一个名为“user”的变量,该变量是由于用户通过 signinRedirect() 登录而设置的。

那么你会做...

logout(){
this.userManager.signoutRedirect({ 'id_token_hint': this.user.id_token });
}

关于c# - IdentityServer4 PostLogoutRedirectUri 空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com