認証に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.RequestType
がLogoutRequest
に設定され、それがGET
要求にを行い、その後見ますASP.NETコアhttps://login.mydomain.com/identity/connect/endsessionは、ログオフ時に呼び出されません。また、私はcontext.ProtocolMessage.RequestType
がLogout
に決して設定されないことに気づいた。 実際にログオフすると、ユーザーは自動的に認証され、ホームページに戻りますか?
ASP.NETコアには何が欠けていますか? IdentityServer3
とASP.NET Core
クライアントを使用したサンプルがありますか? (私はIdentityServer4を使用していないことに注意してください)