无法在 IE 上注销 ADFS 3.0
Unable to sign out of ADFS 3.0 on IE
我们开发了一个使用 ADFS 的 MVC/Angular 应用程序。由于我们正在使用 Angular,因此我们必须围绕 ADFS 创建一个包装器来捕获令牌,以便我们可以将其用作声明,以便 angular 可以访问它。
大部分工作是通过以下方法完成的:
public async override Task Invoke(IOwinContext context)
{
if (context.Request.Path.StartsWithSegments(new PathString(ConfigurationManager.AppSettings["AuthorizationCodeResponsePath"])))
{
var authorizationCode = context.Request.Query[ConfigurationManager.AppSettings["AuthorizationCodeResponseParameter"]];
var token = this.RequestToken(
this.Options.TokenEndpoint,
new Uri(this.Options.ApplicationUri, ConfigurationManager.AppSettings["AuthorizationCodeResponsePath"]),
this.Options.ClientId,
authorizationCode);
var principal = this.ValidateToken(token, this.Options.Audience, this.Options.Issuer, this.Options.Certificate);
this.AddTokenToPrincipal(principal, token);
this.SignIn(context.Authentication, principal);
context.Response.Redirect(this.Options.RedirectPath.Value);
}
else if (context.Request.Path.StartsWithSegments(new PathString(ConfigurationManager.AppSettings["SignOutPath"])))
{
if (context.Request.Query.Any(q => q.Key == "post_logout_redirect_uri"))
{
context.Response.Redirect(ConfigurationManager.AppSettings["ADFS"] + "/adfs/ls/?wa=wsignoutcleanup1.0");
}
else
{
this.SignOut(context.Authentication);
}
}
else
{
await this.Next.Invoke(context);
}
}
基本上在登录时我们将登录到 ADFS,ADFS 将尝试重定向到我们在第一个 if 块中捕获的特定 URL,我们获取授权代码并从此处请求令牌添加声明然后登录。
问题与注销有关,应用程序发出注销请求,url 在第二个块的此处被捕获,并发出注销请求,该请求也尝试重定向到 ADFS 标志出页。我可以看到 .AspNet.Federation 是 expired/removed 但在重新加载页面时应用程序只请求一个新的 cookie。这在 Chrome/Firefox 上工作正常,如果我在发出注销请求之前清除 IE 的 cookie,它将成功完成注销。有什么我可能在这里遗漏的吗?
已使用以下命令更正此问题:
document.execCommand("ClearAuthenticationCache")
我们开发了一个使用 ADFS 的 MVC/Angular 应用程序。由于我们正在使用 Angular,因此我们必须围绕 ADFS 创建一个包装器来捕获令牌,以便我们可以将其用作声明,以便 angular 可以访问它。
大部分工作是通过以下方法完成的:
public async override Task Invoke(IOwinContext context)
{
if (context.Request.Path.StartsWithSegments(new PathString(ConfigurationManager.AppSettings["AuthorizationCodeResponsePath"])))
{
var authorizationCode = context.Request.Query[ConfigurationManager.AppSettings["AuthorizationCodeResponseParameter"]];
var token = this.RequestToken(
this.Options.TokenEndpoint,
new Uri(this.Options.ApplicationUri, ConfigurationManager.AppSettings["AuthorizationCodeResponsePath"]),
this.Options.ClientId,
authorizationCode);
var principal = this.ValidateToken(token, this.Options.Audience, this.Options.Issuer, this.Options.Certificate);
this.AddTokenToPrincipal(principal, token);
this.SignIn(context.Authentication, principal);
context.Response.Redirect(this.Options.RedirectPath.Value);
}
else if (context.Request.Path.StartsWithSegments(new PathString(ConfigurationManager.AppSettings["SignOutPath"])))
{
if (context.Request.Query.Any(q => q.Key == "post_logout_redirect_uri"))
{
context.Response.Redirect(ConfigurationManager.AppSettings["ADFS"] + "/adfs/ls/?wa=wsignoutcleanup1.0");
}
else
{
this.SignOut(context.Authentication);
}
}
else
{
await this.Next.Invoke(context);
}
}
基本上在登录时我们将登录到 ADFS,ADFS 将尝试重定向到我们在第一个 if 块中捕获的特定 URL,我们获取授权代码并从此处请求令牌添加声明然后登录。
问题与注销有关,应用程序发出注销请求,url 在第二个块的此处被捕获,并发出注销请求,该请求也尝试重定向到 ADFS 标志出页。我可以看到 .AspNet.Federation 是 expired/removed 但在重新加载页面时应用程序只请求一个新的 cookie。这在 Chrome/Firefox 上工作正常,如果我在发出注销请求之前清除 IE 的 cookie,它将成功完成注销。有什么我可能在这里遗漏的吗?
已使用以下命令更正此问题:
document.execCommand("ClearAuthenticationCache")