TLDR आप अपने ExternalLoginConfirmation
समारोह में मैन्युअल रूप से सभी परिदृश्यों के माध्यम से जाना, और OAuth प्रयोक्ता आईडी के साथ सदस्यता उपयोगकर्ता id से मिलान करने के लिए सक्षम होने के लिए एक डेटाबेस तालिका की आवश्यकता है। इस तरह आप एक से अधिक स्थानीय खाते के साथ कई OAuth खातों को "संबद्ध" कर सकते हैं।
नीचे हमारे परियोजनाओं में से एक से एक कोड का टुकड़ा है - उम्मीद है कि यह काफी स्पष्ट
public ActionResult ExternalLoginCallback()
{
var returnUrl = HttpContext.Request.QueryString["returnUrl"];
var result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
if (result.IsSuccessful == false)
{
return this.View("ExternalLoginFailure", result);
}
// Login user if provider represents a valid already registered user
if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
{
return this.RedirectToLocal(returnUrl);
}
// If the current user is logged in already - add new account
if (User.Identity.IsAuthenticated)
{
OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);
return this.RedirectToLocal(returnUrl);
}
var membershipUser = Membership.GetUser(result.UserName);
// so user is new - then create new membership account
if (membershipUser == null)
{
MembershipCreateStatus createStatus;
membershipUser = Membership.CreateUser(username: result.UserName, password: this.GetTempPassword(), email: result.UserName, status: out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
this.emailService.SendWelcome(this, (Guid)membershipUser.ProviderUserKey);
// Associate social network account with created membership account
OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, result.UserName);
OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false);
return this.RedirectToLocal(returnUrl);
}
// The problem occured while creating membership account
this.ViewBag.Error = MembershipErrorNameProvider.FromErrorCode(createStatus);
return this.View("CreateMembershipAccountFailure");
}
// If membership account already exists -> Associate Social network account with exists membership account
OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, result.UserName);
OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false);
return this.RedirectToLocal(returnUrl);
}
और OAuthWebSecurity
है है एक सहायक वर्ग है जो सभी प्रदाताओं के साथ सौदों आप समर्थन करते हैं:
public static class OAuthWebSecurity
{
....
public static bool Login(string providerName, string providerUserId, bool createPersistentCookie)
{
var context = new HttpContextWrapper(HttpContext.Current);
var provider = GetOAuthClient(providerName);
var securityManager = new OpenAuthSecurityManager(context, provider, OAuthDataProvider);
return securityManager.Login(providerUserId, createPersistentCookie);
}
public static void CreateOrUpdateAccount(string openAuthProvider, string openAuthId, string userName)
{
var user = UserRepository.FindByName(userName);
if (user == null)
{
throw new MembershipUserNotFoundException();
}
var userOAuthAccount = UserOAuthAccountRepository.Find(openAuthProvider, openAuthId);
if (userOAuthAccount == null)
{
UserOAuthAccountRepository.InsertOrUpdate(new UserOAuthAccount
{
OAuthProvider = openAuthProvider,
OAuthId = openAuthId,
UserId = user.Id
});
}
else
{
userOAuthAccount.UserId = user.Id;
}
UserOAuthAccountRepository.Save();
}
}
क्या यह बट में दर्द नहीं है कि एमएस ने इतनी सरलता से खेला, मौजूदा उपयोगकर्ताओं का एक छोटा सा उल्लेख भी नहीं? और नए उपयोगकर्ताओं के लिए, जो भी सामान्य विवरण आप सामान्य रूप से एकत्र करेंगे, उसके बजाय एमएस डिफ़ॉल्ट सिर्फ उपयोगकर्ता नाम/ईमेल प्राप्त करता है। इसे नए उपयोगकर्ताओं के लिए 'रजिस्टर' पर रीडायरेक्ट करना चाहिए। – ProfK
अच्छी तरह से, हर किसी का उपयोग मामला अलग है - मुझे लगता है कि उन्होंने एक ढांचा बनाया है जो आप अपेक्षाओं के लिए अपेक्षाकृत आसान कर सकते हैं :) – avs099