WebAPI OAuth注销 - 如何删除令牌Cookie?

时间:2016-06-10 07:55:37

标签: c# cookies asp.net-web-api oauth-2.0

我的OAAP登录配置如下:

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(猜猜它的作用)。

I have found that I can logout from MVC使用

System.Web.Security.FormsAuthentication.SignOut();

但我没有以这种方式从WebAPI注销。我还没有找到任何有关如何从WebAPI注销的信息。但是我发现there may be a bug in logout procedure, the cookie is kept and has to be removed manually,但是,代码再次出现在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("<html><title>Logout successful</title><body style=\"font-family:sans-serif\"><div style=\"display:table; width:100%; height:100%; margin:0; padding:0; \"><div style=\"display:table-cell; vertical-align:middle; text-align:center;\">You have been successfully logged out.<br>You can close this window/tab now.</div></div></body></html>");
        response.Headers.AddCookies(cookie1); // Types don't match
        return response;
    }

如何才能实现我的WebAPI已注销,并且在我登录之前需要再次执行OAuth?

2 个答案:

答案 0 :(得分:3)

最简单的方法是让客户自己忘记&#34;忘记&#34;令牌 - 无需告诉服务器(这是清除auth cookie真正做的事情 - 让浏览器删除cookie)。

如果您希望令牌本身不再有效,则需要维护已撤销令牌列表。由于各种原因,您可能希望访问令牌始终有效但短暂存在并取消刷新令牌。

答案 1 :(得分:3)

您无法注销API,因为您尚未登录!

例如,假设您的API使用Facebook作为其OpenID身份验证提供程序。 您的用户必须登录Facebook才能使用您的API。您的API会将它们重定向到facebook auth服务器,如果他们没有登录 - Facebook将要求他们登录。

如果用户决定保持登录Facebook,那么每次他们使用您的API时,他们都不需要再次登录到Facebook,您的中间件代码将获得有效的令牌,以便他们访问您的API。

您的API无法删除Facebook与用户浏览器之间的浏览器Cookie,因此您无法将其从Facebook中删除,因此您无法阻止他们在需要时获取新令牌。

我不知道您使用的OpenID提供程序,但我认为以上适用于任何。

您可以注销MVC应用程序,因为它会在您登录时在您(用户代理)和MVC应用程序之间创建一个cookie。它可以删除自己的cookie!