2014-10-27 95 views
2

我已經在我的MVC5網站上實現了Facebook和Twitter登錄,並且一切正常。MVC oAuth登錄 - 如何確定他們用於登錄哪個社交帳戶

我想要做的似乎很簡單,但我不知道該怎麼做。

我可以得到登錄的用戶名用戶:

System.Web.HttpContext.Current.User.Identity.Name 

不過,我想知道,如果用戶使用Facebook或Twitter,並從相關的社交網絡的登錄ProviderKey。

希望這很容易做

謝謝。

回答

0

您可以使用下面的方法獲取所有外部登錄信息。

private ApplicationUserManager _userManager; 
public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    } 
    private set 
    { 
     _userManager = value; 
    } 
} 

在你的行動:

var getExternalLoginInfor = UserManager.GetLogins(User.Identity.GetUserId()); 

希望這有助於。

+0

嘿 - 感謝您的反饋。這給了我一個用戶註冊的所有登錄的完整列表。但是,有沒有辦法讓我知道他們當前登錄了哪一個? – 2014-10-28 00:37:46

+0

我不確定獲取這些細節的簡單方法,有人會幫助你。但是,如果是社交登錄,則可以將提供者名稱添加到聲明中,並在上下文中使用它,並將其與getExternalLoginInfor進行比較。 http://stackoverflow.com/questions/20383955/how-to-add-claims-in-asp-net-identity – DSR 2014-10-28 01:20:24

0

你可以從AuthenticationManager的擴展方法GetExternalLoginInfo得到它。

var loginInfo = AuthenticationManager.GetExternalLoginInfo(); 
if (loginInfo != null) 
{ 
    var externalProvider = loginInfo.Login.LoginProvider; 
} 

編輯: 在你ApplicationSignInManager : SignInManager類重寫方法SignInAsync

那裏你可以externalLoginInfo並將其添加爲一個要求

public override async Task SignInAsync(User user, bool isPersistent, bool rememberBrowser) 
{ 
    var userIdentity = await CreateUserIdentityAsync(user); 

    // 
    var logininfo = AuthenticationManager.GetExternalLoginInfo(); 
    userIdentity.AddClaim(new Claim("ExternalLoginProvider", logininfo.Login.LoginProvider)); 
    // 

    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie); 
    if (rememberBrowser) 
    { 
     var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id)); 
     AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity, rememberBrowserIdentity); 
    } 
    else 
    { 
     AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity); 
    } 
} 

然後你就可以像這樣訪問:

var identity = (ClaimsIdentity)User.Identity; 
var loginProvide = identity.FindFirst("ExternalLoginProvider").Value; 
+0

這似乎只在登錄過程中起作用。如果稍後調用它,則loginInfo.Login爲null。 – 2014-10-28 21:56:44

+0

@AlwaysLearning更新了我的答案 – tmg 2015-01-28 13:08:13