Add ChangeEmail APIs
This commit is contained in:
parent
5658af6b61
commit
33d8645187
|
|
@ -29,6 +29,8 @@ namespace Microsoft.AspNet.Identity
|
||||||
|
|
||||||
public string PasswordResetTokenProvider { get; set; } = Resources.DefaultTokenProvider;
|
public string PasswordResetTokenProvider { get; set; } = Resources.DefaultTokenProvider;
|
||||||
|
|
||||||
|
public string ChangeEmailTokenProvider { get; set; } = Resources.DefaultTokenProvider;
|
||||||
|
|
||||||
public static string ApplicationCookieAuthenticationType { get; set; } = typeof(IdentityOptions).Namespace + ".Application";
|
public static string ApplicationCookieAuthenticationType { get; set; } = typeof(IdentityOptions).Namespace + ".Application";
|
||||||
public static string ExternalCookieAuthenticationType { get; set; } = typeof(IdentityOptions).Namespace + ".External";
|
public static string ExternalCookieAuthenticationType { get; set; } = typeof(IdentityOptions).Namespace + ".External";
|
||||||
public static string TwoFactorUserIdCookieAuthenticationType { get; set; } = typeof(IdentityOptions).Namespace + ".TwoFactorUserId";
|
public static string TwoFactorUserIdCookieAuthenticationType { get; set; } = typeof(IdentityOptions).Namespace + ".TwoFactorUserId";
|
||||||
|
|
|
||||||
|
|
@ -716,7 +716,7 @@ namespace Microsoft.AspNet.Identity
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// GenerateAsync a new security stamp for a user, used for SignOutEverywhere functionality
|
/// Generate a new security stamp for a user, used for SignOutEverywhere functionality
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="user"></param>
|
/// <param name="user"></param>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
|
|
@ -1337,6 +1337,52 @@ namespace Microsoft.AspNet.Identity
|
||||||
return await store.GetEmailConfirmedAsync(user, cancellationToken);
|
return await store.GetEmailConfirmedAsync(user, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string GetChangeEmailPurpose(string newEmail)
|
||||||
|
{
|
||||||
|
return "ChangeEmail:" + newEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generate a change email token for the user using the UserTokenProvider
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user"></param>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual async Task<string> GenerateChangeEmailTokenAsync(TUser user, string newEmail,
|
||||||
|
CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
ThrowIfDisposed();
|
||||||
|
return await GenerateUserTokenAsync(user, Options.ChangeEmailTokenProvider, GetChangeEmailPurpose(newEmail), cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Change a user's email using a change email token
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <param name="newPassword"></param>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual async Task<IdentityResult> ChangeEmailAsync(TUser user, string newEmail, string token,
|
||||||
|
CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
ThrowIfDisposed();
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("user");
|
||||||
|
}
|
||||||
|
// Make sure the token is valid and the stamp matches
|
||||||
|
if (!await VerifyUserTokenAsync(user, Options.ChangeEmailTokenProvider, GetChangeEmailPurpose(newEmail), token, cancellationToken))
|
||||||
|
{
|
||||||
|
return IdentityResult.Failed(Resources.InvalidToken);
|
||||||
|
}
|
||||||
|
var store = GetEmailStore();
|
||||||
|
await store.SetEmailAsync(user, newEmail, cancellationToken);
|
||||||
|
await store.SetEmailConfirmedAsync(user, true, cancellationToken);
|
||||||
|
await UpdateSecurityStampInternal(user, cancellationToken);
|
||||||
|
return await UpdateAsync(user, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
// IUserPhoneNumberStore methods
|
// IUserPhoneNumberStore methods
|
||||||
internal IUserPhoneNumberStore<TUser> GetPhoneNumberStore()
|
internal IUserPhoneNumberStore<TUser> GetPhoneNumberStore()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1224,6 +1224,23 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
Assert.Equal(stamp, user.SecurityStamp);
|
Assert.Equal(stamp, user.SecurityStamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ChangePhoneNumberFailsWithWrongPhoneNumber()
|
||||||
|
{
|
||||||
|
var manager = CreateManager();
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.PhoneNumber = "123-456-7890";
|
||||||
|
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
|
||||||
|
Assert.False(await manager.IsPhoneNumberConfirmedAsync(user));
|
||||||
|
var stamp = await manager.GetSecurityStampAsync(user);
|
||||||
|
var token1 = await manager.GenerateChangePhoneNumberTokenAsync(user, "111-111-1111");
|
||||||
|
IdentityResultAssert.IsFailure(await manager.ChangePhoneNumberAsync(user, "bogus", token1),
|
||||||
|
"Invalid token.");
|
||||||
|
Assert.False(await manager.IsPhoneNumberConfirmedAsync(user));
|
||||||
|
Assert.Equal(await manager.GetPhoneNumberAsync(user), "123-456-7890");
|
||||||
|
Assert.Equal(stamp, user.SecurityStamp);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task CanVerifyPhoneNumber()
|
public async Task CanVerifyPhoneNumber()
|
||||||
{
|
{
|
||||||
|
|
@ -1241,6 +1258,58 @@ namespace Microsoft.AspNet.Identity.Test
|
||||||
Assert.False(await manager.VerifyChangePhoneNumberTokenAsync(user, token1, num2));
|
Assert.False(await manager.VerifyChangePhoneNumberTokenAsync(user, token1, num2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CanChangeEmail()
|
||||||
|
{
|
||||||
|
var manager = CreateManager();
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Email = user.UserName + "@diddly.bop";
|
||||||
|
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
|
||||||
|
Assert.False(await manager.IsEmailConfirmedAsync(user));
|
||||||
|
var stamp = await manager.GetSecurityStampAsync(user);
|
||||||
|
string newEmail = user.UserName + "@en.vec";
|
||||||
|
var token1 = await manager.GenerateChangeEmailTokenAsync(user, newEmail);
|
||||||
|
IdentityResultAssert.IsSuccess(await manager.ChangeEmailAsync(user, newEmail, token1));
|
||||||
|
Assert.True(await manager.IsEmailConfirmedAsync(user));
|
||||||
|
Assert.Equal(await manager.GetEmailAsync(user), newEmail);
|
||||||
|
Assert.NotEqual(stamp, user.SecurityStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ChangeEmailFailsWithWrongToken()
|
||||||
|
{
|
||||||
|
var manager = CreateManager();
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Email = user.UserName + "@diddly.bop";
|
||||||
|
string oldEmail = user.Email;
|
||||||
|
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
|
||||||
|
Assert.False(await manager.IsEmailConfirmedAsync(user));
|
||||||
|
var stamp = await manager.GetSecurityStampAsync(user);
|
||||||
|
IdentityResultAssert.IsFailure(await manager.ChangeEmailAsync(user, "whatevah@foo.barf", "bogus"),
|
||||||
|
"Invalid token.");
|
||||||
|
Assert.False(await manager.IsEmailConfirmedAsync(user));
|
||||||
|
Assert.Equal(await manager.GetEmailAsync(user), oldEmail);
|
||||||
|
Assert.Equal(stamp, user.SecurityStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ChangeEmailFailsWithEmail()
|
||||||
|
{
|
||||||
|
var manager = CreateManager();
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Email = user.UserName + "@diddly.bop";
|
||||||
|
string oldEmail = user.Email;
|
||||||
|
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user));
|
||||||
|
Assert.False(await manager.IsEmailConfirmedAsync(user));
|
||||||
|
var stamp = await manager.GetSecurityStampAsync(user);
|
||||||
|
var token1 = await manager.GenerateChangeEmailTokenAsync(user, "forgot@alrea.dy");
|
||||||
|
IdentityResultAssert.IsFailure(await manager.ChangeEmailAsync(user, "oops@foo.barf", token1),
|
||||||
|
"Invalid token.");
|
||||||
|
Assert.False(await manager.IsEmailConfirmedAsync(user));
|
||||||
|
Assert.Equal(await manager.GetEmailAsync(user), oldEmail);
|
||||||
|
Assert.Equal(stamp, user.SecurityStamp);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task CanEmailTwoFactorToken()
|
public async Task CanEmailTwoFactorToken()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue