WebAPI OAuth注销 – 如何删除令牌Cookie?
我有一个OAAP登录的WebAPI配置如下:
app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = clientId, Authority = authority, PostLogoutRedirectUri = "https://www.microsoft.com/", Notifications = new OpenIdConnectAuthenticationNotifications { AuthenticationFailed = context => { context.HandleResponse(); context.Response.Redirect("/Error?message=" + context.Exception.Message); return Task.FromResult(0); } } });
和使用登录强制执行所有控制器
config.Filters.Add(new System.Web.Http.AuthorizeAttribute());
我现在想要添加一个名为LogoutController的ApiController(猜猜它是做什么的)。
我发现我可以使用从MVC注销
System.Web.Security.FormsAuthentication.SignOut();
但我没有这样从WebAPI注销。 我还没有找到任何有关如何从WebAPI注销的信息。 但是我发现注销过程中可能存在错误,cookie被保留并且必须手动删除 ,但是,代码再次是MVC,似乎我无法将HttpCookie
放入我的HttpResponseMessage
对象中:
[HttpGet] public HttpResponseMessage Logout() { FormsAuthentication.SignOut(); // clear authentication cookie HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); cookie1.Expires = DateTime.Now.AddYears(-1); var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent("Logout successful You have been successfully logged out.
You can close this window/tab now."); response.Headers.AddCookies(cookie1); // Types don't match return response; }
如何才能实现我的WebAPI已注销,并且在登录之前需要再次执行OAuth?
您无法注销API,因为您尚未登录!
例如,假设您的API使用Facebook作为其OpenID身份validation提供程序。 您的用户必须登录Facebook才能使用您的API。 您的API会将它们重定向到facebook auth服务器,如果他们没有登录 – Facebook会要求他们登录。
如果用户决定保持登录Facebook,那么每次他们使用您的API时,他们都不需要再次登录到Facebook,您的中间件代码将获得有效的令牌,以便他们访问您的API。
您的API无法删除Facebook和用户浏览器之间的浏览器cookie,因此您无法将其从Facebook注销,因此您无法阻止他们在需要时获取新令牌。
我不知道您使用的OpenID提供程序,但我认为以上适用于任何。
您可以注销MVC应用程序,因为它会在您登录时在您(用户代理)和MVC应用程序之间创建一个cookie。它可以删除自己的cookie!
最简单的方法是让客户端自己“忘记”令牌 – 无需告诉服务器它(这是清除auth cookie真正做的事情 – 让浏览器删除cookie)。
如果您希望令牌本身不再有效,则需要维护已撤销令牌列表。 由于各种原因,您可能希望访问令牌始终有效但短暂存在并取消刷新令牌。