13

IdentityServer4 で暗黙的なフローを機能させようとしています。ログインとログアウトは正しく機能しますが、設定する必要がある場所に値を設定しているにもかかわらず、PostLogoutRedirectUri が null に戻ってきます。私が望むのは、ログアウトが完了した後、ログアウト プロセスがアプリケーションにリダイレクトされることです。

logoutId を正しく取得しています。Logout は 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が null であり、AutomaticRedirectAfterSignOutも null であることを意味し、LoggedOut.cshtmlページが読み込まれるときにsignout-callback.jsファイルが読み込まれることはありません。

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

ここに私の構成設定があります。

構成.cs:

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>();

どこが間違っているのかを理解するための支援をいただければ幸いです。

ありがとう!

4

6 に答える 6