我使用身份服务器在Angle 5上安装了前端应用程序,在C#上使用了后端api。 问题是,当我单击注销按钮时,令牌被删除并且我被重定向到注销页面。
但是当我尝试刷新主页时,我被重定向到microsoftonline.com 自动进行身份验证并重定向回主页 我在此处缺少提供用户名和密码,而这种情况以chrome隐身方式出现。
我注意到的是,如果我从microsoftonline.com手动删除cookie, 并重复该过程,这次将要求我输入用户名和密码。
所以首先我试图用这种方式清理所有cookie,但这无济于事
foreach (var key in HttpContext.Request.Cookies.Keys)
{
HttpContext.Response.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddDays(-1) });
}
bellow是我的accountcontroller注销方法和cookie屏幕
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutViewModel model)
{
var idp = User?.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;
var subjectId = HttpContext.User.Identity.GetSubjectId();
if (idp != null && idp != IdentityServerConstants.LocalIdentityProvider)
{
if (model.LogoutId == null)
{
model.LogoutId = await interaction.CreateLogoutContextAsync();
}
try
{
await signInManager.SignOutAsync();
}
catch (NotSupportedException)
{
}
}
// set this so UI rendering sees an anonymous user
HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity());
// get context information (client name, post logout redirect URI and iframe for federated signout)
var logout = await interaction.GetLogoutContextAsync(model.LogoutId);
var vm = new LoggedOutViewModel
{
PostLogoutRedirectUri = logout?.PostLogoutRedirectUri,
ClientName = logout?.ClientId,
SignOutIframeUrl = logout?.SignOutIFrameUrl
};
await persistedGrantService.RemoveAllGrantsAsync(subjectId, "angular2client");
return View("LoggedOut", vm);
}
答案 0 :(得分:1)
请尝试使用Identity Server提供的扩展方法(例如here)从HttpContext本身清除cookie。
或尝试以下操作:
params = {'batch_size': TrainConfig.BATCH_SIZE,
'dim' : ( TrainConfig.BATCH_SIZE, 1, TrainConfig.SAMPLES),
'labels_dim': ( TrainConfig.BATCH_SIZE,),
'n_classes' : TrainConfig.OUTPUT_DIM}
training_generator = DataGenerator(train_set, **params)
validation_generator = DataGenerator(val_set, **params)
training_steps_per_epoch = int(1.*len(train_set) / batch_size)
validation_steps_per_epoch = int(1.*len(val_set) / batch_size)
history = model.fit_generator(generator=training_generator,
verbose=1,
use_multiprocessing=False,
workers=1,
steps_per_epoch=training_steps_per_epoch,
epochs=epochs,
validation_data=validation_generator,
validation_steps =validation_steps_per_epoch,
callbacks=callbacks)
您的注销控制器方法中。
第三个选项(我在一个测试MVC客户端中拥有的选项):
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
在将客户端注册为 public ActionResult Logout()
{
Request.GetOwinContext().Authentication.SignOut();
return Redirect("/");
}
public void SignoutCleanup(string sid)
{
var cp = (ClaimsPrincipal)User;
var sidClaim = cp.FindFirst("sid");
if (sidClaim != null && sidClaim.Value == sid)
{
Request.GetOwinContext().Authentication.SignOut("Cookies");
}
}
(或{{})时,在单击按钮时调用Logout
方法的地方,SignoutCleanup
是传递给Identity Server的方法。 1}},或两者都取决于您的情况。
PS :现在,总的来说,我认为您的方法是不正确的,但是我不知道您的全部情况,因此,我不会对您进行评判-只是给出建议和建议。>
对于前端客户端(Angular,Vue,vanilla JS等),建议使用客户端oidc-client-js库。 here是用法示例。就像我说的-这只是一个建议,但是如果您刚开始进行身份验证设置,则建议您看看。
答案 1 :(得分:1)
如果我理解正确,那么您是通过IdentityServer4服务与Microsoft联合的吗?如果是这样,那么当您退出身份服务时,还应该为用户提供退出外部提供程序的选项(如果它支持相关功能-需要在发现文档中定义end_session_endpoint
) 。
标准OIDC中间件支持此功能,因此您应该能够通过调用SignoutAsync()并传递MS联合登录的方案名称来启动退出。
另一种选择是始终在外部登录请求中发送prompt=login
,然后检查您退回的auth_time
声明。这样一来,您就可以始终强制进行交互式登录,并可以验证何时发生交互式登录。