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 @@
-