2013-06-05 64 views
1

我有一个ASP.NET MVC 4应用程序,允许用户使用Gmail等外部服务登录。使用oauth从外部登录服务(Gmail,脸书)注销

到目前为止,用户可以在应用程序内部登录和导航。但问题是在注销。我有一个注销该请求的按钮,在我的AccountController中调用控制器操作LogOff()。在该方法中,如果用户通过oauth进行身份验证,如何注销?

本地帐户,我用:

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

但通过OAuth我没有看到类似的事情...... 我想我需要清除某种饼干的,但我不知道如何...

回答

2

基于this,我采取了以下客户端解决方案(我问以前,如果用户想也登出的提供者):

//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; 
    } 
} 

希望这有助于别人。

+0

你在哪里以及如何添加这个,即时消息总共mvc noob(3小时)添加这个,因为我有完全相同的问题 – Slartibartfast

+0

@Slartibartfast您可以在'

1

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

如果你想确保令牌注销后不会保留你可以调用

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

的信息是从this网页。还有一些值得一读的细节。

+0

谢谢,但删除会话值的解决方案没有工作...当我登出我的应用程序,并尝试登录与另一个帐户我不能,我直接用以前的帐户登录.. 。但是,如果我注销,例如,在Facebook页面中,我可以使用另一个帐户登录...并且Google服务在ExtraData中默认没有该令牌... – amp

+0

好的,所以你想要能够从您的应用中清除第三方Cookie?如果您想添加登录方法,您可以在帐户管理页面中关联其他帐户。 – James

+0

是的,我认为清理cookie应该可以解决问题......我该怎么做?你有一些基本的例子吗? – amp

1

听起来像您想要将用户从源验证站点注销?只有认证站点才能删除/修改其Cookie。

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

脸谱,例如,有一个API调用:

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

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