0

認証にIdentityServer 3を使用しています。私は2つのクライアントアプリケーションを持っています.1つは、従来のASP.NET MVC 5とASP.NET Coreを使用して開発されています。どちらのアプリケーションは以下のように実装される機能ログアウトしている:IdentityServer3ログオフ機能がASP.NETコアクライアントで機能しない

をクラシックASP.NET MVCは5

アプリケーションの起動

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    {   
     var CK = new CookieAuthenticationOptions() 
     { 
      AuthenticationType = "Cookies", 
      CookieName = "MyCookie" 
     }; 

     app.UseCookieAuthentication(CK); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      Authority = "https://login.mydomain.com/identity", 
      Scope = "openid profile", 
      ClientId = "myclientid", 
      RedirectUri = "http://localhost:34937/", 
      ResponseType = "id_token", 
      SignInAsAuthenticationType = "Cookies", 

      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       SecurityTokenValidated = (context) => 
       { 
        // do claim transformation here 
       }, 

       RedirectToIdentityProvider = (n) => 
       { 
        if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest) 
        { 
         var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token").Value; 
         n.ProtocolMessage.IdTokenHint = idTokenHint; 
        } 
        return Task.FromResult(0); 
       } 
      } 
    } 
} 

アカウントコントローラは、ログオフアクション

public class AccountController:Controller 
    { 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     Request.GetOwinContext().Authentication.SignOut(); 
     return Redirect("/"); 
    } 
    } 

ASPを持っています。 NETコア

アプリケーションの起動

public static class IApplicationBuilderExtensions 
    { 
     public static void UseIdentityServer(this IApplicationBuilder app, string authority, string clientId) 
     { 
      app.UseCookieAuthentication(new CookieAuthenticationOptions() 
      { 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true, 
       AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme, 
       LoginPath = "/home", 
       AccessDeniedPath = new PathString(IdentityConstant.AccessDeniedPath), 
       CookieName = "MtAuthCookie", 
       SlidingExpiration = true 
      }); 

      JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();   

      var connectOptions = new OpenIdConnectOptions() 
      {     
       AutomaticChallenge = true, 
       Authority = authority, 
       ClientId = clientId, 
       ResponseType = "id_token", 
       AuthenticationScheme = OpenIdConnectDefaults.AuthenticationScheme, 
       SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme,    
       CallbackPath = "/home", 
       Events = new OpenIdConnectEvents() 
       { 
        OnTokenValidated = async context => 
        { 
         //create new identity to store only required claims here.      
        }, 
        OnRedirectToIdentityProvider = async context => 
        { 
         if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout) 
         { 
          var idTokenHint = context.HttpContext.User.FindFirst("id_token"); 
          if (idTokenHint != null) 
           context.ProtocolMessage.IdTokenHint = idTokenHint.Value; 
         } 
         await Task.FromResult(0); 
        }      
       } 
      };   


      app.UseOpenIdConnectAuthentication(connectOptions); 
     } 
    } 
} 

アカウントコントローラが正常に動作している古典的なasp.netログオフアクションでログオフアクション

public class AccountController:Controller 
    { 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> LogOff() 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      await HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); 
     } 
     return Redirect("/"); 
    } 
    } 

問題
を持っています。で

しかしhttps://devlogin.crowdreason.com/identity/logout?id=xxxxページについに

https://login.mydomain.com/identity/connect/endsession?id_token_hint=XXXXXXXXXXXXXX
https://login.mydomain.com/identity/logout?id=XXXXXX
https://login.mydomain.com/identity/connect/endsessioncallback?sid=XXXXXX

とユーザーlandup:私はそれがOnRedirectToIdentityProviderイベントを実行してもcontext.ProtocolMessage.RequestTypeLogoutRequestに設定され、それがGET要求にを行い、その後見ますASP.NETコアhttps://login.mydomain.com/identity/connect/endsessionは、ログオフ時に呼び出されません。また、私はcontext.ProtocolMessage.RequestTypeLogoutに決して設定されないことに気づいた。 実際にログオフすると、ユーザーは自動的に認証され、ホームページに戻りますか?

ASP.NETコアには何が欠けていますか? IdentityServer3ASP.NET Coreクライアントを使用したサンプルがありますか? (私はIdentityServer4を使用していないことに注意してください)

答えて

0

私はそれに対して別のイベントがあると思います。これは私のために働く:

OnRedirectToIdentityProviderForSignOut = context => 
       { 
        var idTokenHint = context.HttpContext.User.FindFirst("id_token"); 

        if (idTokenHint != null) 
        { 
         context.ProtocolMessage.IdTokenHint = idTokenHint.Value; 
        } 

        return Task.FromResult(0); 
       } 
関連する問題