v9 fix misc issues external member login (#12093)
* Add missing override for SetTokenAsync * Fix mismatch between expected scheme prefix and exception message * Store tokens on member update
This commit is contained in:
@@ -181,6 +181,7 @@ namespace Umbraco.Cms.Core.Security
|
||||
{
|
||||
// we have to remember whether Logins property is dirty, since the UpdateMemberProperties will reset it.
|
||||
var isLoginsPropertyDirty = user.IsPropertyDirty(nameof(MemberIdentityUser.Logins));
|
||||
var isTokensPropertyDirty = user.IsPropertyDirty(nameof(MemberIdentityUser.LoginTokens));
|
||||
|
||||
MemberDataChangeType memberChangeType = UpdateMemberProperties(found, user);
|
||||
if (memberChangeType == MemberDataChangeType.FullSave)
|
||||
@@ -203,6 +204,16 @@ namespace Umbraco.Cms.Core.Security
|
||||
x.ProviderKey,
|
||||
x.UserData)));
|
||||
}
|
||||
|
||||
if (isTokensPropertyDirty)
|
||||
{
|
||||
_externalLoginService.Save(
|
||||
found.Key,
|
||||
user.LoginTokens.Select(x => new ExternalLoginToken(
|
||||
x.LoginProvider,
|
||||
x.Name,
|
||||
x.Value)));
|
||||
}
|
||||
}
|
||||
|
||||
return Task.FromResult(IdentityResult.Success);
|
||||
@@ -535,6 +546,37 @@ namespace Umbraco.Cms.Core.Security
|
||||
return found;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overridden to support Umbraco's own data storage requirements
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The base class's implementation of this calls into FindTokenAsync and AddUserTokenAsync, both methods will only work with ORMs that are change
|
||||
/// tracking ORMs like EFCore.
|
||||
/// </remarks>
|
||||
/// <inheritdoc />
|
||||
public override Task SetTokenAsync(MemberIdentityUser user, string loginProvider, string name, string value, CancellationToken cancellationToken)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
ThrowIfDisposed();
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(user));
|
||||
}
|
||||
|
||||
IIdentityUserToken token = user.LoginTokens.FirstOrDefault(x => x.LoginProvider.InvariantEquals(loginProvider) && x.Name.InvariantEquals(name));
|
||||
if (token == null)
|
||||
{
|
||||
user.LoginTokens.Add(new IdentityUserToken(loginProvider, name, value, user.Id));
|
||||
}
|
||||
else
|
||||
{
|
||||
token.Value = value;
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private MemberIdentityUser AssignLoginsCallback(MemberIdentityUser user)
|
||||
{
|
||||
if (user != null)
|
||||
|
||||
Reference in New Issue
Block a user