diff --git a/src/Umbraco.Abstractions/Models/Identity/IUserLoginInfo.cs b/src/Umbraco.Abstractions/Models/Identity/IUserLoginInfo.cs new file mode 100644 index 0000000000..84dc1da7e0 --- /dev/null +++ b/src/Umbraco.Abstractions/Models/Identity/IUserLoginInfo.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Core.Models.Identity +{ + public interface IUserLoginInfo + { + /// + /// Provider for the linked login, i.e. Facebook, Google, etc. + /// + string LoginProvider { get; set; } + + /// User specific key for the login provider + string ProviderKey { get; set; } + } +} diff --git a/src/Umbraco.Core/Persistence/Repositories/IExternalLoginRepository.cs b/src/Umbraco.Abstractions/Persistence/Repositories/IExternalLoginRepository.cs similarity index 71% rename from src/Umbraco.Core/Persistence/Repositories/IExternalLoginRepository.cs rename to src/Umbraco.Abstractions/Persistence/Repositories/IExternalLoginRepository.cs index 6d145e9961..ed6f2e4fb1 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IExternalLoginRepository.cs +++ b/src/Umbraco.Abstractions/Persistence/Repositories/IExternalLoginRepository.cs @@ -1,12 +1,11 @@ using System.Collections.Generic; -using Microsoft.AspNet.Identity; using Umbraco.Core.Models.Identity; namespace Umbraco.Core.Persistence.Repositories { public interface IExternalLoginRepository : IReadWriteQueryRepository { - void SaveUserLogins(int memberId, IEnumerable logins); + void SaveUserLogins(int memberId, IEnumerable logins); void DeleteUserLogins(int memberId); } } diff --git a/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs b/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs new file mode 100644 index 0000000000..926d919ca9 --- /dev/null +++ b/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNet.Identity; + +namespace Umbraco.Core.Models.Identity +{ + internal class UserLoginInfoWrapper : IUserLoginInfo + { + private readonly UserLoginInfo _info; + + public static IUserLoginInfo Wrap(UserLoginInfo info) => new UserLoginInfoWrapper(info); + + private UserLoginInfoWrapper(UserLoginInfo info) + { + _info = info; + } + + public string LoginProvider + { + get => _info.LoginProvider; + set => _info.LoginProvider = value; + } + + public string ProviderKey + { + get => _info.ProviderKey; + set => _info.ProviderKey = value; + } + } +} diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs index f708590ea8..bb1bd29a8a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs @@ -25,7 +25,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement Database.Execute("DELETE FROM ExternalLogins WHERE UserId=@userId", new { userId = memberId }); } - public void SaveUserLogins(int memberId, IEnumerable logins) + public void SaveUserLogins(int memberId, IEnumerable logins) { //clear out logins for member Database.Execute("DELETE FROM umbracoExternalLogin WHERE userId=@userId", new { userId = memberId }); diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Core/Security/BackOfficeUserStore.cs index 085a7b7a5b..d48bcc841f 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Core/Security/BackOfficeUserStore.cs @@ -141,7 +141,7 @@ namespace Umbraco.Core.Security if (isLoginsPropertyDirty) { var logins = await GetLoginsAsync(user); - _externalLoginService.SaveUserLogins(found.Id, logins); + _externalLoginService.SaveUserLogins(found.Id, logins.Select(UserLoginInfoWrapper.Wrap)); } } } @@ -382,7 +382,7 @@ namespace Umbraco.Core.Security if (login == null) throw new ArgumentNullException("login"); //get all logins associated with the login id - var result = _externalLoginService.Find(login).ToArray(); + var result = _externalLoginService.Find(UserLoginInfoWrapper.Wrap(login)).ToArray(); if (result.Any()) { //return the first user that matches the result diff --git a/src/Umbraco.Core/Services/IExternalLoginService.cs b/src/Umbraco.Core/Services/IExternalLoginService.cs index a81543cf2d..2342fca0d9 100644 --- a/src/Umbraco.Core/Services/IExternalLoginService.cs +++ b/src/Umbraco.Core/Services/IExternalLoginService.cs @@ -22,14 +22,14 @@ namespace Umbraco.Core.Services /// /// /// - IEnumerable Find(UserLoginInfo login); + IEnumerable Find(IUserLoginInfo login); /// /// Save user logins /// /// /// - void SaveUserLogins(int userId, IEnumerable logins); + void SaveUserLogins(int userId, IEnumerable logins); /// /// Deletes all user logins - normally used when a member is deleted diff --git a/src/Umbraco.Core/Services/Implement/ExternalLoginService.cs b/src/Umbraco.Core/Services/Implement/ExternalLoginService.cs index aedf3874dd..0d6a345e90 100644 --- a/src/Umbraco.Core/Services/Implement/ExternalLoginService.cs +++ b/src/Umbraco.Core/Services/Implement/ExternalLoginService.cs @@ -40,7 +40,7 @@ namespace Umbraco.Core.Services.Implement /// /// /// - public IEnumerable Find(UserLoginInfo login) + public IEnumerable Find(IUserLoginInfo login) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { @@ -54,7 +54,7 @@ namespace Umbraco.Core.Services.Implement /// /// /// - public void SaveUserLogins(int userId, IEnumerable logins) + public void SaveUserLogins(int userId, IEnumerable logins) { using (var scope = ScopeProvider.CreateScope()) { diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 907811b351..b104fb6039 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -234,6 +234,7 @@ + @@ -922,7 +923,6 @@ -