1

我有一个 ASP.NET MVC 4 应用程序,它允许用户使用 Gmail 等外部服务登录。

到目前为止,用户能够登录并在应用程序内部导航。但问题在于注销。我有一个按钮来注销该请求,调用LogOff()我的AccountController. 在该方法中,如果用户通过 oauth 进行身份验证,我该如何注销?

使用本地帐户,我使用:

public ActionResult LogOff()
        {
            WebSecurity.Logout();
            return RedirectToAction("Login", "Account");
        }

但是对于oauth,我看不到任何类似的东西......我想我需要清除某种cookie,但我不知道如何......

4

3 回答 3

2

基于,我实现了以下客户端解决方案(我之前询问用户是否也想在提供程序中注销):

//get accountType, accessToken, redirectUrl and clientID
var accountType = ...;
var accessToken = ...;
var redirectUrl = ...;
var clientID = ...;
$("#logoutConfirmButton").on('click', function () {
    externalLogout();
});

function externalLogout() {
    var url, params;
    if (accountType== "facebook") {
        url = "https://www.facebook.com/logout.php";
        params = {
            next: redirectUrl,
            access_token: encodeURIComponent(accessToken)
        };
        performCallLogout(url, params, accountType);
    } else if (accountType== "google") {
        url = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout";
        params = {
            next: redirectUrl
        }
        performCallLogout(url, params, accountType);
    } else if (accountType == "microsoft") {
        url = "https://login.live.com/oauth20_logout.srf";
        params = {
            clientId: clientID,
            redirectUrl: redirectUrl
        }
        performCallLogout(url, params, accountType);
    }
}

function performCallLogout(url, params, accountType) {
    if (accountType == "facebook") {
        window.location.href = url + "?next=" + params.next + "&access_token=" + params.access_token;
    } else if (accountType == "google") {
        window.location.href = url + "?continue=" + params.next;
    } else if (accountType == "microsoft") {
        window.location.href = url + "?client_id=" + params.clientId + "&redirect_url=" + params.redirectUrl;
    }
}

希望这对某人有所帮助。

于 2013-06-15T20:20:25.533 回答
1

听起来您想将用户从源身份验证站点中注销?只有身份验证站点可以删除/修改其 cookie。

解决方案是将用户重定向到身份验证站点的注销页面,或使用 API 脚本将用户注销(如果该站点存在)。您可以使用具有“目标”属性的表单打开一个如果您不希望主浏览器窗口重定向,则为新窗口。

例如,FaceBook 有一个 API 调用:

FB.logout(function(response) { // user is now logged out });

MVC FaceBook 客户端也有一个方法GetLogoutUrl,它返回一个您可以在服务器端使用的 URL。

于 2013-06-11T04:06:42.070 回答
1

WebSecurity.Logout();即使他们通过 OAuth 进行身份验证,也会注销用户。

如果您想确保令牌在注销后不会持续存在,您可以致电

Session.Remove("facebooktoken"); //Facebook example

信息来自这个网页。那里还有一些值得一读的细节。

于 2013-06-05T20:18:50.273 回答