Identity.Security not enough to prevent infection

- Viral cancellationToken API infection everywhere
- Add Identity.Security SignInManager which depends on Abstractions
This commit is contained in:
Hao Kung 2014-04-02 12:25:52 -07:00
parent 0dcb918084
commit 8549d83b7c
41 changed files with 1192 additions and 491 deletions

View File

@ -27,6 +27,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.T
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Aspnet.Identity.InMemory.Test.net45", "test\Microsoft.Aspnet.Identity.InMemory.Test\Microsoft.Aspnet.Identity.InMemory.Test.net45.csproj", "{9102E676-B509-4A78-AD66-A479C50FD1C3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Security.k10", "src\Microsoft.AspNet.Identity.Security\Microsoft.AspNet.Identity.Security.k10.csproj", "{DE98C383-A3D7-47EC-AE37-C7F707F16486}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Security.net45", "src\Microsoft.AspNet.Identity.Security\Microsoft.AspNet.Identity.Security.net45.csproj", "{BD765B85-9839-4901-B231-E49465596A75}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Security.Test.net45", "test\Microsoft.AspNet.Identity.Security.Test\Microsoft.AspNet.Identity.Security.Test.net45.csproj", "{30A2C4BB-86AB-4971-BC63-4761E8CE7D0F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -65,6 +71,18 @@ Global
{9102E676-B509-4A78-AD66-A479C50FD1C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9102E676-B509-4A78-AD66-A479C50FD1C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9102E676-B509-4A78-AD66-A479C50FD1C3}.Release|Any CPU.Build.0 = Release|Any CPU
{DE98C383-A3D7-47EC-AE37-C7F707F16486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE98C383-A3D7-47EC-AE37-C7F707F16486}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE98C383-A3D7-47EC-AE37-C7F707F16486}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE98C383-A3D7-47EC-AE37-C7F707F16486}.Release|Any CPU.Build.0 = Release|Any CPU
{BD765B85-9839-4901-B231-E49465596A75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD765B85-9839-4901-B231-E49465596A75}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD765B85-9839-4901-B231-E49465596A75}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD765B85-9839-4901-B231-E49465596A75}.Release|Any CPU.Build.0 = Release|Any CPU
{30A2C4BB-86AB-4971-BC63-4761E8CE7D0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30A2C4BB-86AB-4971-BC63-4761E8CE7D0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30A2C4BB-86AB-4971-BC63-4761E8CE7D0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30A2C4BB-86AB-4971-BC63-4761E8CE7D0F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -74,11 +92,14 @@ Global
{77CEDA6C-A833-455D-8357-649BFD944724} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
{E00E23B0-79B8-41E1-9998-57FECA1F2535} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
{9102E676-B509-4A78-AD66-A479C50FD1C3} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
{30A2C4BB-86AB-4971-BC63-4761E8CE7D0F} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
{B72401D7-47F6-4A98-89D5-CCBFEFC5B2B8} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{E52361C9-1F0B-4229-86A0-E5C7C12A5429} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{054B3FFA-7196-466F-9A8A-593FFE037A69} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{BD765B85-9839-4901-B231-E49465596A75} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{6211450F-FFB8-431F-84E2-9A7620875260} = {77CEDA6C-A833-455D-8357-649BFD944724}
{D32483A4-B617-480C-81E6-49CD596B9A34} = {77CEDA6C-A833-455D-8357-649BFD944724}
{D2E7A146-C39F-4302-8EA3-BFA8C1082939} = {77CEDA6C-A833-455D-8357-649BFD944724}
{DE98C383-A3D7-47EC-AE37-C7F707F16486} = {77CEDA6C-A833-455D-8357-649BFD944724}
EndGlobalSection
EndGlobal

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity.InMemory
@ -9,13 +10,13 @@ namespace Microsoft.AspNet.Identity.InMemory
{
private readonly Dictionary<string, InMemoryRole> _roles = new Dictionary<string, InMemoryRole>();
public Task Create(InMemoryRole role)
public Task Create(InMemoryRole role, CancellationToken cancellationToken = default(CancellationToken))
{
_roles[role.Id] = role;
return Task.FromResult(0);
}
public Task Delete(InMemoryRole role)
public Task Delete(InMemoryRole role, CancellationToken cancellationToken = default(CancellationToken))
{
if (role == null || !_roles.ContainsKey(role.Id))
{
@ -25,13 +26,13 @@ namespace Microsoft.AspNet.Identity.InMemory
return Task.FromResult(0);
}
public Task Update(InMemoryRole role)
public Task Update(InMemoryRole role, CancellationToken cancellationToken = default(CancellationToken))
{
_roles[role.Id] = role;
return Task.FromResult(0);
}
public Task<InMemoryRole> FindById(string roleId)
public Task<InMemoryRole> FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken))
{
if (_roles.ContainsKey(roleId))
{
@ -40,7 +41,7 @@ namespace Microsoft.AspNet.Identity.InMemory
return Task.FromResult<InMemoryRole>(null);
}
public Task<InMemoryRole> FindByName(string roleName)
public Task<InMemoryRole> FindByName(string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
return
Task.FromResult(

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity.InMemory
@ -29,99 +30,99 @@ namespace Microsoft.AspNet.Identity.InMemory
get { return _users.Values.AsQueryable(); }
}
public Task<IList<Claim>> GetClaims(TUser user)
public Task<IList<Claim>> GetClaims(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.Claims);
}
public Task AddClaim(TUser user, Claim claim)
public Task AddClaim(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
{
user.Claims.Add(claim);
return Task.FromResult(0);
}
public Task RemoveClaim(TUser user, Claim claim)
public Task RemoveClaim(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
{
user.Claims.Remove(claim);
return Task.FromResult(0);
}
public Task SetEmail(TUser user, string email)
public Task SetEmail(TUser user, string email, CancellationToken cancellationToken = default(CancellationToken))
{
user.Email = email;
return Task.FromResult(0);
}
public Task<string> GetEmail(TUser user)
public Task<string> GetEmail(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.Email);
}
public Task<bool> GetEmailConfirmed(TUser user)
public Task<bool> GetEmailConfirmed(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.EmailConfirmed);
}
public Task SetEmailConfirmed(TUser user, bool confirmed)
public Task SetEmailConfirmed(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
user.EmailConfirmed = confirmed;
return Task.FromResult(0);
}
public Task<TUser> FindByEmail(string email)
public Task<TUser> FindByEmail(string email, CancellationToken cancellationToken = default(CancellationToken))
{
return
Task.FromResult(
Users.FirstOrDefault(u => String.Equals(u.Email, email, StringComparison.OrdinalIgnoreCase)));
}
public Task<DateTimeOffset> GetLockoutEndDate(TUser user)
public Task<DateTimeOffset> GetLockoutEndDate(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.LockoutEnd);
}
public Task SetLockoutEndDate(TUser user, DateTimeOffset lockoutEnd)
public Task SetLockoutEndDate(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken))
{
user.LockoutEnd = lockoutEnd;
return Task.FromResult(0);
}
public Task<int> IncrementAccessFailedCount(TUser user)
public Task<int> IncrementAccessFailedCount(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
user.AccessFailedCount++;
return Task.FromResult(user.AccessFailedCount);
}
public Task ResetAccessFailedCount(TUser user)
public Task ResetAccessFailedCount(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
user.AccessFailedCount = 0;
return Task.FromResult(0);
}
public Task<int> GetAccessFailedCount(TUser user)
public Task<int> GetAccessFailedCount(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.AccessFailedCount);
}
public Task<bool> GetLockoutEnabled(TUser user)
public Task<bool> GetLockoutEnabled(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.LockoutEnabled);
}
public Task SetLockoutEnabled(TUser user, bool enabled)
public Task SetLockoutEnabled(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
{
user.LockoutEnabled = enabled;
return Task.FromResult(0);
}
public Task AddLogin(TUser user, UserLoginInfo login)
public Task AddLogin(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
user.Logins.Add(login);
_logins[login] = user;
return Task.FromResult(0);
}
public Task RemoveLogin(TUser user, UserLoginInfo login)
public Task RemoveLogin(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
var logs =
user.Logins.Where(l => l.ProviderKey == login.ProviderKey && l.LoginProvider == login.LoginProvider)
@ -134,12 +135,12 @@ namespace Microsoft.AspNet.Identity.InMemory
return Task.FromResult(0);
}
public Task<IList<UserLoginInfo>> GetLogins(TUser user)
public Task<IList<UserLoginInfo>> GetLogins(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.Logins);
}
public Task<TUser> Find(UserLoginInfo login)
public Task<TUser> Find(UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
if (_logins.ContainsKey(login))
{
@ -148,19 +149,19 @@ namespace Microsoft.AspNet.Identity.InMemory
return Task.FromResult<TUser>(null);
}
public Task Create(TUser user)
public Task Create(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
_users[user.Id] = user;
return Task.FromResult(0);
}
public Task Update(TUser user)
public Task Update(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
_users[user.Id] = user;
return Task.FromResult(0);
}
public Task<TUser> FindById(string userId)
public Task<TUser> FindById(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
if (_users.ContainsKey(userId))
{
@ -173,14 +174,14 @@ namespace Microsoft.AspNet.Identity.InMemory
{
}
public Task<TUser> FindByName(string userName)
public Task<TUser> FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken))
{
return
Task.FromResult(
Users.FirstOrDefault(u => String.Equals(u.UserName, userName, StringComparison.OrdinalIgnoreCase)));
}
public Task Delete(TUser user)
public Task Delete(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
if (user == null || !_users.ContainsKey(user.Id))
{
@ -190,84 +191,84 @@ namespace Microsoft.AspNet.Identity.InMemory
return Task.FromResult(0);
}
public Task SetPasswordHash(TUser user, string passwordHash)
public Task SetPasswordHash(TUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken))
{
user.PasswordHash = passwordHash;
return Task.FromResult(0);
}
public Task<string> GetPasswordHash(TUser user)
public Task<string> GetPasswordHash(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.PasswordHash);
}
public Task<bool> HasPassword(TUser user)
public Task<bool> HasPassword(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.PasswordHash != null);
}
public Task SetPhoneNumber(TUser user, string phoneNumber)
public Task SetPhoneNumber(TUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken))
{
user.PhoneNumber = phoneNumber;
return Task.FromResult(0);
}
public Task<string> GetPhoneNumber(TUser user)
public Task<string> GetPhoneNumber(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.PhoneNumber);
}
public Task<bool> GetPhoneNumberConfirmed(TUser user)
public Task<bool> GetPhoneNumberConfirmed(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.PhoneNumberConfirmed);
}
public Task SetPhoneNumberConfirmed(TUser user, bool confirmed)
public Task SetPhoneNumberConfirmed(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
user.PhoneNumberConfirmed = confirmed;
return Task.FromResult(0);
}
public Task AddToRole(TUser user, string role)
public Task AddToRole(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken))
{
user.Roles.Add(role);
return Task.FromResult(0);
}
public Task RemoveFromRole(TUser user, string role)
public Task RemoveFromRole(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken))
{
user.Roles.Remove(role);
return Task.FromResult(0);
}
public Task<IList<string>> GetRoles(TUser user)
public Task<IList<string>> GetRoles(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.Roles);
}
public Task<bool> IsInRole(TUser user, string role)
public Task<bool> IsInRole(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.Roles.Contains(role));
}
public Task SetSecurityStamp(TUser user, string stamp)
public Task SetSecurityStamp(TUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken))
{
user.SecurityStamp = stamp;
return Task.FromResult(0);
}
public Task<string> GetSecurityStamp(TUser user)
public Task<string> GetSecurityStamp(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.SecurityStamp);
}
public Task SetTwoFactorEnabled(TUser user, bool enabled)
public Task SetTwoFactorEnabled(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
{
user.TwoFactorEnabled = enabled;
return Task.FromResult(0);
}
public Task<bool> GetTwoFactorEnabled(TUser user)
public Task<bool> GetTwoFactorEnabled(TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(user.TwoFactorEnabled);
}

View File

@ -0,0 +1,164 @@
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Abstractions;
using Microsoft.AspNet.Abstractions.Security;
namespace Microsoft.AspNet.Identity.Security
{
public class SignInManager<TUser, TKey>
where TUser : class, IUser<TKey>
where TKey : IEquatable<TKey>
{
private string _authType;
public string AuthenticationType
{
get { return _authType ?? "Microsoft.AspNet.Identity"; }
set { _authType = value; }
}
public UserManager<TUser, TKey> UserManager { get; set; }
public HttpContext Context { get; set; }
public virtual async Task<ClaimsIdentity> CreateUserIdentity(TUser user)
{
if (UserManager == null)
{
return null;
}
return await UserManager.CreateIdentity(user, AuthenticationType);
}
public virtual async Task SignIn(TUser user, bool isPersistent, bool rememberBrowser)
{
if (Context == null)
{
return;
}
// TODO: all the two factor logic/external/rememberBrowser
var userIdentity = await CreateUserIdentity(user);
Context.Response.SignIn(userIdentity, new AuthenticationProperties { IsPersistent = isPersistent });
}
//public virtual async Task<bool> SendTwoFactorCode(string provider)
//{
// var userId = await GetVerifiedUserId();
// if (userId == null)
// {
// return false;
// }
// var token = await UserManager.GenerateTwoFactorToken(userId, provider);
// // See IdentityConfig.cs to plug in Email/SMS services to actually send the code
// await UserManager.NotifyTwoFactorToken(userId, provider, token);
// return true;
//}
//public Task<TKey> GetVerifiedUserId()
//{
// //var result = await AuthenticationManager.Authenticate(DefaultAuthenticationTypes.TwoFactorCookie);
// //if (result != null && result.Identity != null && !String.IsNullOrEmpty(result.Identity.GetUserId()))
// //{
// // return result.Identity.GetUserId();
// //}
// return Task.FromResult(default(TKey));
//}
//public async Task<bool> HasBeenVerified()
//{
// return await GetVerifiedUserId() != null;
//}
//public virtual async Task<SignInStatus> TwoFactorSignIn(string provider, string code, bool isPersistent, bool rememberBrowser)
//{
// var userId = await GetVerifiedUserId();
// if (userId == null)
// {
// return SignInStatus.Failure;
// }
// var user = await UserManager.FindById(userId);
// if (user == null)
// {
// return SignInStatus.Failure;
// }
// if (await UserManager.IsLockedOut(user.Id))
// {
// return SignInStatus.LockedOut;
// }
// if (await UserManager.VerifyTwoFactorToken(user.Id, provider, code))
// {
// // When token is verified correctly, clear the access failed count used for lockout
// await UserManager.ResetAccessFailedCount(user.Id);
// await SignIn(user, isPersistent, rememberBrowser);
// return SignInStatus.Success;
// }
// // If the token is incorrect, record the failure which also may cause the user to be locked out
// await UserManager.AccessFailed(user.Id);
// return SignInStatus.Failure;
//}
//public async Task<SignInStatus> ExternalSignIn(ExternalLoginInfo loginInfo, bool isPersistent)
//{
// var user = await UserManager.Find(loginInfo.Login);
// if (user == null)
// {
// return SignInStatus.Failure;
// }
// if (await UserManager.IsLockedOut(user.Id))
// {
// return SignInStatus.LockedOut;
// }
// return await SignInOrTwoFactor(user, isPersistent);
//}
//private async Task<SignInStatus> SignInOrTwoFactor(TUser user, bool isPersistent)
//{
// if (await UserManager.GetTwoFactorEnabled(user.Id))
// //&& !await AuthenticationManager.TwoFactorBrowserRemembered(user.Id))
// {
// //var identity = new ClaimsIdentity(DefaultAuthenticationTypes.TwoFactorCookie);
// //identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id));
// //AuthenticationManager.SignIn(identity);
// return SignInStatus.RequiresTwoFactorAuthentication;
// }
// await SignIn(user, isPersistent, false);
// return SignInStatus.Success;
//}
public virtual async Task<SignInStatus> PasswordSignIn(string userName, string password, bool isPersistent, bool shouldLockout)
{
if (UserManager == null)
{
return SignInStatus.Failure;
}
var user = await UserManager.FindByName(userName);
if (user == null)
{
return SignInStatus.Failure;
}
if (await UserManager.IsLockedOut(user.Id))
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPassword(user, password))
{
await SignIn(user, isPersistent, false);
return SignInStatus.Success;
//TODO: return await SignInOrTwoFactor(user, isPersistent);
}
if (shouldLockout)
{
// If lockout is requested, increment access failed count which might lock out the user
await UserManager.AccessFailed(user.Id);
if (await UserManager.IsLockedOut(user.Id))
{
return SignInStatus.LockedOut;
}
}
return SignInStatus.Failure;
}
}
}

View File

@ -0,0 +1,11 @@
namespace Microsoft.AspNet.Identity.Security
{
public enum SignInStatus
{
Success,
LockedOut,
RequiresTwoFactorAuthentication,
Failure
}
}

View File

@ -0,0 +1,31 @@
{
"version": "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"System.Security.Claims" : "0.1-alpha-*",
"Microsoft.AspNet.Abstractions" : "0.1-alpha-*",
"Microsoft.AspNet.Identity" : "0.1-alpha-*",
"Microsoft.AspNet.Security.DataProtection" : "0.1-alpha-*"
},
"configurations": {
"net45": {},
"k10": {
"dependencies": {
"System.Collections": "4.0.0.0",
"System.ComponentModel": "4.0.0.0",
"System.Diagnostics.Debug": "4.0.10.0",
"System.Diagnostics.Tools": "4.0.0.0",
"System.Globalization": "4.0.10.0",
"System.Linq": "4.0.0.0",
"System.Linq.Expressions": "4.0.0.0",
"System.Reflection": "4.0.10.0",
"System.Resources.ResourceManager": "4.0.0.0",
"System.Runtime": "4.0.20.0",
"System.Runtime.Extensions": "4.0.10.0",
"System.Security.Principal": "4.0.0.0",
"System.Text.Encoding": "4.0.20.0",
"System.Threading.Tasks": "4.0.10.0"
}
}
}
}

View File

@ -1,5 +1,7 @@
using System;
using System.Globalization;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -57,7 +59,7 @@ namespace Microsoft.AspNet.Identity
/// <param name="authenticationType"></param>
/// <returns></returns>
public virtual async Task<ClaimsIdentity> Create(UserManager<TUser, TKey> manager, TUser user,
string authenticationType)
string authenticationType, CancellationToken cancellationToken = default(CancellationToken))
{
if (manager == null)
{
@ -68,15 +70,15 @@ namespace Microsoft.AspNet.Identity
throw new ArgumentNullException("user");
}
var id = new ClaimsIdentity(authenticationType, UserNameClaimType, RoleClaimType);
id.AddClaim(new Claim(UserIdClaimType, ConvertIdToString(user.Id), ClaimValueTypes.String));
id.AddClaim(new Claim(UserIdClaimType, Convert.ToString(user.Id, CultureInfo.InvariantCulture), ClaimValueTypes.String));
id.AddClaim(new Claim(UserNameClaimType, user.UserName, ClaimValueTypes.String));
if (manager.SupportsUserSecurityStamp)
{
id.AddClaim(new Claim(SecurityStampClaimType, await manager.GetSecurityStamp(user.Id)));
id.AddClaim(new Claim(SecurityStampClaimType, await manager.GetSecurityStamp(user.Id, cancellationToken)));
}
if (manager.SupportsUserRole)
{
var roles = await manager.GetRoles(user.Id);
var roles = await manager.GetRoles(user.Id, cancellationToken);
foreach (var roleName in roles)
{
id.AddClaim(new Claim(RoleClaimType, roleName, ClaimValueTypes.String));
@ -84,23 +86,9 @@ namespace Microsoft.AspNet.Identity
}
if (manager.SupportsUserClaim)
{
id.AddClaims(await manager.GetClaims(user.Id));
id.AddClaims(await manager.GetClaims(user.Id, cancellationToken));
}
return id;
}
/// <summary>
/// Convert the key to a string, by default just calls .ToString()
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public virtual string ConvertIdToString(TKey key)
{
if (key == null || key.Equals(default(TKey)))
{
return null;
}
return key.ToString();
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -19,7 +20,8 @@ namespace Microsoft.AspNet.Identity
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="authenticationType"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<ClaimsIdentity> Create(UserManager<TUser, TKey> manager, TUser user, string authenticationType);
Task<ClaimsIdentity> Create(UserManager<TUser, TKey> manager, TUser user, string authenticationType, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
{
@ -11,7 +12,8 @@ namespace Microsoft.AspNet.Identity
/// This method should send the message
/// </summary>
/// <param name="message"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Send(IdentityMessage message);
Task Send(IdentityMessage message, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,3 +1,4 @@
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -11,6 +12,6 @@ namespace Microsoft.AspNet.Identity
/// Validate the item
/// </summary>
/// <returns></returns>
Task<IdentityResult> Validate(string password);
Task<IdentityResult> Validate(string password, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -14,35 +15,40 @@ namespace Microsoft.AspNet.Identity
/// Insert a new role
/// </summary>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Create(TRole role);
Task Create(TRole role, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Update a role
/// </summary>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Update(TRole role);
Task Update(TRole role, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Delete a role
/// </summary>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Delete(TRole role);
Task Delete(TRole role, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Finds a role by id
/// </summary>
/// <param name="roleId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TRole> FindById(TKey roleId);
Task<TRole> FindById(TKey roleId, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Find a role by name
/// </summary>
/// <param name="roleName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TRole> FindByName(string roleName);
Task<TRole> FindByName(string roleName, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -17,7 +18,8 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="role"></param>
/// <param name="manager"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IdentityResult> Validate(RoleManager<TRole, TKey> manager, TRole role);
Task<IdentityResult> Validate(RoleManager<TRole, TKey> manager, TRole role, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -15,23 +16,26 @@ namespace Microsoft.AspNet.Identity
/// Returns the claims for the user with the issuer set
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IList<Claim>> GetClaims(TUser user);
Task<IList<Claim>> GetClaims(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Add a new user claim
/// </summary>
/// <param name="user"></param>
/// <param name="claim"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task AddClaim(TUser user, Claim claim);
Task AddClaim(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Remove a user claim
/// </summary>
/// <param name="user"></param>
/// <param name="claim"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task RemoveClaim(TUser user, Claim claim);
Task RemoveClaim(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
{
@ -14,36 +15,41 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="email"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetEmail(TUser user, string email);
Task SetEmail(TUser user, string email, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Get the user email
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<string> GetEmail(TUser user);
Task<string> GetEmail(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns true if the user email is confirmed
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> GetEmailConfirmed(TUser user);
Task<bool> GetEmailConfirmed(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Sets whether the user email is confirmed
/// </summary>
/// <param name="user"></param>
/// <param name="confirmed"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetEmailConfirmed(TUser user, bool confirmed);
Task SetEmailConfirmed(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns the user associated with this email
/// </summary>
/// <param name="email"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TUser> FindByEmail(string email);
Task<TUser> FindByEmail(string email, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -15,52 +16,59 @@ namespace Microsoft.AspNet.Identity
/// not locked out.
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<DateTimeOffset> GetLockoutEndDate(TUser user);
Task<DateTimeOffset> GetLockoutEndDate(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Locks a user out until the specified end date (set to a past date, to unlock a user)
/// </summary>
/// <param name="user"></param>
/// <param name="lockoutEnd"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetLockoutEndDate(TUser user, DateTimeOffset lockoutEnd);
Task SetLockoutEndDate(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Used to record when an attempt to access the user has failed
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<int> IncrementAccessFailedCount(TUser user);
Task<int> IncrementAccessFailedCount(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Used to reset the account access count, typically after the account is successfully accessed
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task ResetAccessFailedCount(TUser user);
Task ResetAccessFailedCount(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns the current number of failed access attempts. This number usually will be reset whenever the password is
/// verified or the account is locked out.
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<int> GetAccessFailedCount(TUser user);
Task<int> GetAccessFailedCount(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns whether the user can be locked out.
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> GetLockoutEnabled(TUser user);
Task<bool> GetLockoutEnabled(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Sets whether the user can be locked out.
/// </summary>
/// <param name="user"></param>
/// <param name="enabled"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetLockoutEnabled(TUser user, bool enabled);
Task SetLockoutEnabled(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -15,28 +16,33 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="login"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task AddLogin(TUser user, UserLoginInfo login);
Task AddLogin(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Removes the user login with the specified combination if it exists, returns true if found and removed
/// </summary>
/// <param name="user"></param>
/// <param name="login"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task RemoveLogin(TUser user, UserLoginInfo login);
Task RemoveLogin(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns the linked accounts for this user
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IList<UserLoginInfo>> GetLogins(TUser user);
Task<IList<UserLoginInfo>> GetLogins(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns the user associated with this login
/// </summary>
/// <param name="login"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TUser> Find(UserLoginInfo login);
Task<TUser> Find(UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
{
@ -14,21 +15,24 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="passwordHash"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetPasswordHash(TUser user, string passwordHash);
Task SetPasswordHash(TUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Get the user password hash
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<string> GetPasswordHash(TUser user);
Task<string> GetPasswordHash(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns true if a user has a password set
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> HasPassword(TUser user);
Task<bool> HasPassword(TUser user, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
{
@ -14,29 +15,33 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="phoneNumber"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetPhoneNumber(TUser user, string phoneNumber);
Task SetPhoneNumber(TUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Get the user phoneNumber
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<string> GetPhoneNumber(TUser user);
Task<string> GetPhoneNumber(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns true if the user phone number is confirmed
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> GetPhoneNumberConfirmed(TUser user);
Task<bool> GetPhoneNumberConfirmed(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Sets whether the user phone number is confirmed
/// </summary>
/// <param name="user"></param>
/// <param name="confirmed"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetPhoneNumberConfirmed(TUser user, bool confirmed);
Task SetPhoneNumberConfirmed(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -15,30 +16,34 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="roleName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task AddToRole(TUser user, string roleName);
Task AddToRole(TUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Removes the role for the user
/// </summary>
/// <param name="user"></param>
/// <param name="roleName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task RemoveFromRole(TUser user, string roleName);
Task RemoveFromRole(TUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns the roles for this user
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IList<string>> GetRoles(TUser user);
Task<IList<string>> GetRoles(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns true if a user is in a role
/// </summary>
/// <param name="user"></param>
/// <param name="roleName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> IsInRole(TUser user, string roleName);
Task<bool> IsInRole(TUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
{
@ -14,14 +15,16 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="stamp"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetSecurityStamp(TUser user, string stamp);
Task SetSecurityStamp(TUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Get the user security stamp
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<string> GetSecurityStamp(TUser user);
Task<string> GetSecurityStamp(TUser user, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -14,35 +15,40 @@ namespace Microsoft.AspNet.Identity
/// Insert a new user
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Create(TUser user);
Task Create(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Update a user
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Update(TUser user);
Task Update(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Delete a user
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Delete(TUser user);
Task Delete(TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Finds a user
/// </summary>
/// <param name="userId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TUser> FindById(TKey userId);
Task<TUser> FindById(TKey userId, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Find a user by name
/// </summary>
/// <param name="userName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TUser> FindByName(string userName);
Task<TUser> FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -14,8 +15,9 @@ namespace Microsoft.AspNet.Identity
/// <param name="purpose"></param>
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<string> Generate(string purpose, UserManager<TUser, TKey> manager, TUser user);
Task<string> Generate(string purpose, UserManager<TUser, TKey> manager, TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Validate and unprotect a token, returns null if invalid
@ -24,8 +26,9 @@ namespace Microsoft.AspNet.Identity
/// <param name="token"></param>
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> Validate(string purpose, string token, UserManager<TUser, TKey> manager, TUser user);
Task<bool> Validate(string purpose, string token, UserManager<TUser, TKey> manager, TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Notifies the user that a token has been generated, i.e. via email or sms, or can no-op
@ -33,15 +36,17 @@ namespace Microsoft.AspNet.Identity
/// <param name="token"></param>
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Notify(string token, UserManager<TUser, TKey> manager, TUser user);
Task Notify(string token, UserManager<TUser, TKey> manager, TUser user, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns true if provider can be used for this user, i.e. could require a user to have an email
/// </summary>
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> IsValidProviderForUser(UserManager<TUser, TKey> manager, TUser user);
Task<bool> IsValidProviderForUser(UserManager<TUser, TKey> manager, TUser user, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
{
@ -14,14 +15,16 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="user"></param>
/// <param name="enabled"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task SetTwoFactorEnabled(TUser user, bool enabled);
Task SetTwoFactorEnabled(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns whether two factor is enabled for the user
/// </summary>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> GetTwoFactorEnabled(TUser user);
Task<bool> GetTwoFactorEnabled(TUser user, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -17,7 +18,8 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IdentityResult> Validate(UserManager<TUser, TKey> manager, TUser user);
Task<IdentityResult> Validate(UserManager<TUser, TKey> manager, TUser user, CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -40,8 +41,9 @@ namespace Microsoft.AspNet.Identity
/// Ensures that the string is of the required length and meets the configured requirements
/// </summary>
/// <param name="item"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual Task<IdentityResult> Validate(string item)
public virtual Task<IdentityResult> Validate(string item, CancellationToken cancellationToken = default(CancellationToken))
{
if (item == null)
{

View File

@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -92,17 +93,18 @@ namespace Microsoft.AspNet.Identity
GC.SuppressFinalize(this);
}
private async Task<IdentityResult> ValidateRoleInternal(TRole role)
private async Task<IdentityResult> ValidateRoleInternal(TRole role, CancellationToken cancellationToken)
{
return (RoleValidator == null) ? IdentityResult.Success : await RoleValidator.Validate(this, role);
return (RoleValidator == null) ? IdentityResult.Success : await RoleValidator.Validate(this, role, cancellationToken);
}
/// <summary>
/// Create a role
/// </summary>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<IdentityResult> Create(TRole role)
public virtual async Task<IdentityResult> Create(TRole role, CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
if (role == null)
@ -110,12 +112,12 @@ namespace Microsoft.AspNet.Identity
throw new ArgumentNullException("role");
}
var result = await ValidateRoleInternal(role);
var result = await ValidateRoleInternal(role, cancellationToken);
if (!result.Succeeded)
{
return result;
}
await Store.Create(role);
await Store.Create(role, cancellationToken);
return IdentityResult.Success;
}
@ -123,8 +125,9 @@ namespace Microsoft.AspNet.Identity
/// Update an existing role
/// </summary>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<IdentityResult> Update(TRole role)
public virtual async Task<IdentityResult> Update(TRole role, CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
if (role == null)
@ -132,12 +135,12 @@ namespace Microsoft.AspNet.Identity
throw new ArgumentNullException("role");
}
var result = await ValidateRoleInternal(role);
var result = await ValidateRoleInternal(role, cancellationToken);
if (!result.Succeeded)
{
return result;
}
await Store.Update(role);
await Store.Update(role, cancellationToken);
return IdentityResult.Success;
}
@ -145,8 +148,9 @@ namespace Microsoft.AspNet.Identity
/// Delete a role
/// </summary>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<IdentityResult> Delete(TRole role)
public virtual async Task<IdentityResult> Delete(TRole role, CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
if (role == null)
@ -154,7 +158,7 @@ namespace Microsoft.AspNet.Identity
throw new ArgumentNullException("role");
}
await Store.Delete(role);
await Store.Delete(role, cancellationToken);
return IdentityResult.Success;
}
@ -162,8 +166,9 @@ namespace Microsoft.AspNet.Identity
/// Returns true if the role exists
/// </summary>
/// <param name="roleName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<bool> RoleExists(string roleName)
public virtual async Task<bool> RoleExists(string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
if (roleName == null)
@ -171,26 +176,28 @@ namespace Microsoft.AspNet.Identity
throw new ArgumentNullException("roleName");
}
return await FindByName(roleName) != null;
return await FindByName(roleName, cancellationToken) != null;
}
/// <summary>
/// Find a role by id
/// </summary>
/// <param name="roleId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<TRole> FindById(TKey roleId)
public virtual async Task<TRole> FindById(TKey roleId, CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
return await Store.FindById(roleId);
return await Store.FindById(roleId, cancellationToken);
}
/// <summary>
/// Find a role by name
/// </summary>
/// <param name="roleName"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<TRole> FindByName(string roleName)
public virtual async Task<TRole> FindByName(string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
if (roleName == null)
@ -198,7 +205,7 @@ namespace Microsoft.AspNet.Identity
throw new ArgumentNullException("roleName");
}
return await Store.FindByName(roleName);
return await Store.FindByName(roleName, cancellationToken);
}
private void ThrowIfDisposed()

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity
@ -19,8 +20,9 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="manager"></param>
/// <param name="role"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<IdentityResult> Validate(RoleManager<TRole, TKey> manager, TRole role)
public virtual async Task<IdentityResult> Validate(RoleManager<TRole, TKey> manager, TRole role, CancellationToken cancellationToken = default(CancellationToken))
{
if (manager == null)
{

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,4 @@
using System.Threading;
#if NET45
using System.Net.Mail;
#endif
@ -41,8 +42,9 @@ namespace Microsoft.AspNet.Identity
/// </summary>
/// <param name="manager"></param>
/// <param name="user"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual async Task<IdentityResult> Validate(UserManager<TUser, TKey> manager, TUser user)
public virtual async Task<IdentityResult> Validate(UserManager<TUser, TKey> manager, TUser user, CancellationToken cancellationToken = default(CancellationToken))
{
if (manager == null)
{

View File

@ -3,6 +3,7 @@
"dependencies": {
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"System.Security.Claims" : "0.1-alpha-*",
"Microsoft.AspNet.HttpFeature" : "0.1-alpha-*",
"Microsoft.AspNet.Security.DataProtection" : "0.1-alpha-*"
},
"configurations": {

View File

@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.Testing;
using Xunit;
@ -388,23 +389,23 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
private class StaticTokenProvider : IUserTokenProvider<InMemoryUser, string>
{
public Task<string> Generate(string purpose, UserManager<InMemoryUser, string> manager,
InMemoryUser user)
InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(MakeToken(purpose, user));
}
public Task<bool> Validate(string purpose, string token, UserManager<InMemoryUser, string> manager,
InMemoryUser user)
InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(token == MakeToken(purpose, user));
}
public Task Notify(string token, UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task Notify(string token, UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<bool> IsValidProviderForUser(UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task<bool> IsValidProviderForUser(UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(true);
}
@ -719,17 +720,17 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
{
public const string ErrorMessage = "I'm Bad.";
public Task<IdentityResult> Validate(string password)
public Task<IdentityResult> Validate(string password, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(IdentityResult.Failed(ErrorMessage));
}
public Task<IdentityResult> Validate(RoleManager<InMemoryRole, string> manager, InMemoryRole role)
public Task<IdentityResult> Validate(RoleManager<InMemoryRole, string> manager, InMemoryRole role, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(IdentityResult.Failed(ErrorMessage));
}
public Task<IdentityResult> Validate(UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task<IdentityResult> Validate(UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(IdentityResult.Failed(ErrorMessage));
}
@ -1092,23 +1093,23 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
private class EmailTokenProvider : IUserTokenProvider<InMemoryUser, string>
{
public Task<string> Generate(string purpose, UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task<string> Generate(string purpose, UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(MakeToken(purpose));
}
public Task<bool> Validate(string purpose, string token, UserManager<InMemoryUser, string> manager,
InMemoryUser user)
InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(token == MakeToken(purpose));
}
public Task Notify(string token, UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task Notify(string token, UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return manager.SendEmail(user.Id, token, token);
}
public async Task<bool> IsValidProviderForUser(UserManager<InMemoryUser, string> manager, InMemoryUser user)
public async Task<bool> IsValidProviderForUser(UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return !string.IsNullOrEmpty(await manager.GetEmail(user.Id));
}
@ -1121,23 +1122,23 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
private class SmsTokenProvider : IUserTokenProvider<InMemoryUser, string>
{
public Task<string> Generate(string purpose, UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task<string> Generate(string purpose, UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(MakeToken(purpose));
}
public Task<bool> Validate(string purpose, string token, UserManager<InMemoryUser, string> manager,
InMemoryUser user)
InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(token == MakeToken(purpose));
}
public Task Notify(string token, UserManager<InMemoryUser, string> manager, InMemoryUser user)
public Task Notify(string token, UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return manager.SendSms(user.Id, token);
}
public async Task<bool> IsValidProviderForUser(UserManager<InMemoryUser, string> manager, InMemoryUser user)
public async Task<bool> IsValidProviderForUser(UserManager<InMemoryUser, string> manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return !string.IsNullOrEmpty(await manager.GetPhoneNumber(user.Id));
}
@ -1419,7 +1420,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test
{
public IdentityMessage Message { get; set; }
public Task Send(IdentityMessage message)
public Task Send(IdentityMessage message, CancellationToken cancellationToken = default(CancellationToken))
{
Message = message;
return Task.FromResult(0);

View File

@ -0,0 +1,173 @@
using System.Threading;
using Microsoft.AspNet.Abstractions;
using Microsoft.AspNet.Abstractions.Security;
using Moq;
using System.Security.Claims;
using System.Threading.Tasks;
using Xunit;
namespace Microsoft.AspNet.Identity.Security.Test
{
public class SignInManagerTest
{
#if NET45
//TODO: Mock fails in K (this works fine in net45)
[Fact]
public async Task EnsureClaimsIdentityFactoryCreateIdentityCalled()
{
// Setup
var store = new Mock<IUserStore<TestUser, string>>();
var user = new TestUser { UserName = "Foo" };
var userManager = new UserManager<TestUser, string>(store.Object);
var identityFactory = new Mock<IClaimsIdentityFactory<TestUser, string>>();
const string authType = "Test";
var testIdentity = new ClaimsIdentity(authType);
identityFactory.Setup(s => s.Create(userManager, user, authType, CancellationToken.None)).ReturnsAsync(testIdentity).Verifiable();
userManager.ClaimsIdentityFactory = identityFactory.Object;
var context = new Mock<HttpContext>();
var response = new Mock<HttpResponse>();
context.Setup(c => c.Response).Returns(response.Object).Verifiable();
response.Setup(r => r.SignIn(testIdentity, It.IsAny<AuthenticationProperties>())).Verifiable();
var helper = new SignInManager<TestUser, string> { UserManager = userManager, AuthenticationType = authType, Context = context.Object };
// Act
await helper.SignIn(user, false, false);
// Assert
identityFactory.VerifyAll();
}
[Fact]
public async Task PasswordSignInReturnsLockedOutWhenLockedOut()
{
// Setup
var user = new TestUser { UserName = "Foo" };
var manager = new Mock<UserManager<TestUser, string>>();
manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).ReturnsAsync(true).Verifiable();
manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable();
var helper = new SignInManager<TestUser, string> { UserManager = manager.Object };
// Act
var result = await helper.PasswordSignIn(user.UserName, "bogus", false, false);
// Assert
Assert.Equal(SignInStatus.LockedOut, result);
manager.VerifyAll();
}
[Fact]
public async Task CanPasswordSignIn()
{
// Setup
var user = new TestUser { UserName = "Foo" };
var manager = new Mock<UserManager<TestUser, string>>();
manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).ReturnsAsync(false).Verifiable();
manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable();
manager.Setup(m => m.CheckPassword(user, "password", CancellationToken.None)).ReturnsAsync(true).Verifiable();
manager.Setup(m => m.CreateIdentity(user, "Microsoft.AspNet.Identity", CancellationToken.None)).ReturnsAsync(new ClaimsIdentity("Microsoft.AspNet.Identity")).Verifiable();
var context = new Mock<HttpContext>();
var response = new Mock<HttpResponse>();
context.Setup(c => c.Response).Returns(response.Object).Verifiable();
response.Setup(r => r.SignIn(It.IsAny<ClaimsIdentity>(), It.IsAny<AuthenticationProperties>())).Verifiable();
var helper = new SignInManager<TestUser, string> { UserManager = manager.Object, Context = context.Object };
// Act
var result = await helper.PasswordSignIn(user.UserName, "password", false, false);
// Assert
Assert.Equal(SignInStatus.Success, result);
manager.VerifyAll();
}
[Fact]
public async Task PasswordSignInFailsWithWrongPassword()
{
// Setup
var user = new TestUser { UserName = "Foo" };
var manager = new Mock<UserManager<TestUser, string>>();
manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).ReturnsAsync(false).Verifiable();
manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable();
manager.Setup(m => m.CheckPassword(user, "bogus", CancellationToken.None)).ReturnsAsync(false).Verifiable();
var helper = new SignInManager<TestUser, string> { UserManager = manager.Object };
// Act
var result = await helper.PasswordSignIn(user.UserName, "bogus", false, false);
// Assert
Assert.Equal(SignInStatus.Failure, result);
manager.VerifyAll();
}
[Fact]
public async Task PasswordSignInFailsWithUnknownUser()
{
// Setup
var manager = new Mock<UserManager<TestUser, string>>();
manager.Setup(m => m.FindByName("bogus", CancellationToken.None)).ReturnsAsync(null).Verifiable();
var helper = new SignInManager<TestUser, string> { UserManager = manager.Object };
// Act
var result = await helper.PasswordSignIn("bogus", "bogus", false, false);
// Assert
Assert.Equal(SignInStatus.Failure, result);
manager.VerifyAll();
}
[Fact]
public async Task PasswordSignInFailsWithNoUserManager()
{
// Setup
var helper = new SignInManager<TestUser, string>();
// Act
var result = await helper.PasswordSignIn("bogus", "bogus", false, false);
// Assert
Assert.Equal(SignInStatus.Failure, result);
}
[Fact]
public async Task CreateUserIdentityReturnsNullNoUserManager()
{
// Setup
var user = new TestUser();
var helper = new SignInManager<TestUser, string>();
// Act
var result = await helper.CreateUserIdentity(user);
// Assert
Assert.Null(result);
}
[Fact]
public async Task PasswordSignInFailsWithWrongPasswordCanAccessFailedAndLockout()
{
// Setup
var user = new TestUser { UserName = "Foo" };
var manager = new Mock<UserManager<TestUser, string>>();
var lockedout = false;
manager.Setup(m => m.AccessFailed(user.Id, CancellationToken.None)).Returns(() =>
{
lockedout = true;
return Task.FromResult(IdentityResult.Success);
}).Verifiable();
manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).Returns(() => Task.FromResult(lockedout));
manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable();
manager.Setup(m => m.CheckPassword(user, "bogus", CancellationToken.None)).ReturnsAsync(false).Verifiable();
var helper = new SignInManager<TestUser, string> { UserManager = manager.Object };
// Act
var result = await helper.PasswordSignIn(user.UserName, "bogus", false, true);
// Assert
Assert.Equal(SignInStatus.LockedOut, result);
manager.VerifyAll();
}
#endif
}
}

View File

@ -0,0 +1,12 @@
namespace Microsoft.AspNet.Identity.Security.Test
{
public class TestUser : TestUser<string>
{
}
public class TestUser<TKey> : IUser<TKey>
{
public TKey Id { get; private set; }
public string UserName { get; set; }
}
}

View File

@ -0,0 +1,48 @@
{
"version": "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.Abstractions" : "0.1-alpha-*",
"Microsoft.AspNet.ConfigurationModel" : "0.1-alpha-*",
"Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*",
"Microsoft.AspNet.Identity" : "0.1-alpha-*",
"Microsoft.AspNet.Identity.Security" : "0.1-alpha-*",
"Microsoft.AspNet.Testing" : "0.1-alpha-*",
"System.Security.Claims" : "0.1-alpha-*",
"Xunit.KRunner": "0.1-alpha-*",
"xunit.abstractions": "2.0.0-aspnet-*",
"xunit.assert": "2.0.0-aspnet-*",
"xunit.core": "2.0.0-aspnet-*",
"xunit.execution": "2.0.0-aspnet-*"
},
"configurations": {
"net45": {
"dependencies": {
"Moq" : "4.2.1312.1622",
"System.Runtime": "",
"System.Collections": ""
}
},
"k10": {
"dependencies": {
"System.Collections": "4.0.0.0",
"System.Collections.Concurrent": "4.0.0.0",
"System.ComponentModel": "4.0.0.0",
"System.Console": "4.0.0.0",
"System.Diagnostics.Debug": "4.0.10.0",
"System.Globalization": "4.0.10.0",
"System.Linq": "4.0.0.0",
"System.Linq.Expressions": "4.0.0.0",
"System.Reflection": "4.0.10.0",
"System.Reflection.Extensions": "4.0.0.0",
"System.Resources.ResourceManager": "4.0.0.0",
"System.Runtime": "4.0.20.0",
"System.Runtime.Extensions": "4.0.10.0",
"System.Threading": "4.0.0.0",
"System.Threading.Tasks": "4.0.10.0"
}
}
},
"commands": {
"test": "Xunit.KRunner"
}
}

View File

@ -1,5 +1,9 @@
using System;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Identity.Test
@ -19,29 +23,49 @@ namespace Microsoft.AspNet.Identity.Test
async () => await factory.Create(manager, new TestUser(), null));
}
[Fact]
public void ConvertIdToStringWithDefaultStringReturnsNull()
#if NET45
//TODO: Mock fails in K (this works fine in net45)
[Theory]
[InlineData(false, false)]
[InlineData(false, true)]
[InlineData(true, false)]
[InlineData(true, true)]
public async Task EnsureClaimsIdentityHasExpectedClaims(bool supportRoles, bool supportClaims)
{
// Setup
var userManager = new Mock<UserManager<TestUser, string>>();
var user = new TestUser { UserName = "Foo" };
userManager.Setup(m => m.SupportsUserRole).Returns(supportRoles);
userManager.Setup(m => m.SupportsUserClaim).Returns(supportClaims);
var roleClaims = new[] { "Admin", "Local" };
userManager.Setup(m => m.GetRoles(user.Id, CancellationToken.None)).ReturnsAsync(roleClaims);
var userClaims = new[] { new Claim("Whatever", "Value"), new Claim("Whatever2", "Value2") };
userManager.Setup(m => m.GetClaims(user.Id, CancellationToken.None)).ReturnsAsync(userClaims);
const string authType = "Microsoft.AspNet.Identity";
var factory = new ClaimsIdentityFactory<TestUser, string>();
Assert.Null(factory.ConvertIdToString(default(string)));
}
[Fact]
public void ConvertIdToStringWithDefaultIntReturnsNull()
{
var factory = new ClaimsIdentityFactory<TestUser<int>, int>();
Assert.Null(factory.ConvertIdToString(default(int)));
}
// Act
var identity = await factory.Create(userManager.Object, user, authType);
[Fact]
public void ConvertIdToStringWithDefaultGuidReturnsNull()
{
var factory = new ClaimsIdentityFactory<TestUser<Guid>, Guid>();
Assert.Null(factory.ConvertIdToString(default(Guid)));
// Assert
Assert.NotNull(identity);
Assert.Equal(authType, identity.AuthenticationType);
var claims = identity.Claims;
Assert.NotNull(claims);
Assert.True(
claims.Any(c => c.Type == factory.UserNameClaimType && c.Value == user.UserName));
Assert.True(claims.Any(c => c.Type == factory.UserIdClaimType && c.Value == user.Id));
Assert.Equal(supportRoles, claims.Any(c => c.Type == factory.RoleClaimType && c.Value == "Admin"));
Assert.Equal(supportRoles, claims.Any(c => c.Type == factory.RoleClaimType && c.Value == "Local"));
foreach (var cl in userClaims)
{
Assert.Equal(supportClaims, claims.Any(c => c.Type == cl.Type && c.Value == cl.Value));
}
}
#endif
// TODO: Need Mock (test in InMemory for now)
//[Fact]
//[Fact]
//public async Task ClaimsIdentityTest()
//{
// var db = UnitTestHelper.CreateDefaultDb();

View File

@ -1,25 +1,26 @@
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity.Test
{
public class NoopRoleStore : IRoleStore<TestRole, string>
{
public Task Create(TestRole user)
public Task Create(TestRole user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task Update(TestRole user)
public Task Update(TestRole user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<TestRole> FindById(string roleId)
public Task<TestRole> FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestRole>(null);
}
public Task<TestRole> FindByName(string userName)
public Task<TestRole> FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestRole>(null);
}
@ -28,7 +29,7 @@ namespace Microsoft.AspNet.Identity.Test
{
}
public Task Delete(TestRole user)
public Task Delete(TestRole user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}

View File

@ -1,25 +1,26 @@
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity.Test
{
public class NoopUserStore : IUserStore<TestUser, string>
{
public Task Create(TestUser user)
public Task Create(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task Update(TestUser user)
public Task Update(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<TestUser> FindById(string userId)
public Task<TestUser> FindById(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestUser>(null);
}
public Task<TestUser> FindByName(string userName)
public Task<TestUser> FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestUser>(null);
}
@ -28,7 +29,7 @@ namespace Microsoft.AspNet.Identity.Test
{
}
public Task Delete(TestUser user)
public Task Delete(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}

View File

@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
@ -57,27 +58,27 @@ namespace Microsoft.AspNet.Identity.Test
private class NotImplementedStore : IRoleStore<TestRole, string>
{
public Task Create(TestRole role)
public Task Create(TestRole role, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task Update(TestRole role)
public Task Update(TestRole role, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task Delete(TestRole role)
public Task Delete(TestRole role, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<TestRole> FindById(string roleId)
public Task<TestRole> FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<TestRole> FindByName(string roleName)
public Task<TestRole> FindByName(string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}

View File

@ -1,12 +1,18 @@
using System;
namespace Microsoft.AspNet.Identity.Test
{
public class TestUser : TestUser<string>
{
public TestUser()
{
Id = Guid.NewGuid().ToString();
}
}
public class TestUser<TKey> : IUser<TKey>
{
public TKey Id { get; private set; }
public TKey Id { get; set; }
public string UserName { get; set; }
}
}

View File

@ -2,8 +2,10 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.Testing;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Identity.Test
@ -27,23 +29,100 @@ namespace Microsoft.AspNet.Identity.Test
Assert.NotNull(manager.StorePublic);
}
#if NET45
//TODO: Mock fails in K (this works fine in net45)
//[Fact]
//public async Task CreateTest()
//{
// // Setup
// var store = new Mock<IUserStore<TestUser, string>>();
// var user = new TestUser();
// store.Setup(s => s.Create(user)).Verifiable();
// var userManager = new UserManager<TestUser, string>(store.Object);
[Fact]
public async Task CreateCallsStore()
{
// Setup
var store = new Mock<IUserStore<TestUser, string>>();
var user = new TestUser { UserName = "Foo" };
store.Setup(s => s.Create(user, CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable();
var validator = new Mock<UserValidator<TestUser, string>>();
var userManager = new UserManager<TestUser, string>(store.Object);
validator.Setup(v => v.Validate(userManager, user, CancellationToken.None)).Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
userManager.UserValidator = validator.Object;
// // Act
// var result = await userManager.Create(user);
// Act
var result = await userManager.Create(user);
// // Assert
// Assert.True(result.Succeeded);
// store.VerifyAll();
//}
// Assert
Assert.True(result.Succeeded);
store.VerifyAll();
}
[Fact]
public async Task DeleteCallsStore()
{
// Setup
var store = new Mock<IUserStore<TestUser, string>>();
var user = new TestUser { UserName = "Foo" };
store.Setup(s => s.Delete(user, CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable();
var userManager = new UserManager<TestUser, string>(store.Object);
// Act
var result = await userManager.Delete(user);
// Assert
Assert.True(result.Succeeded);
store.VerifyAll();
}
[Fact]
public async Task UpdateCallsStore()
{
// Setup
var store = new Mock<IUserStore<TestUser, string>>();
var user = new TestUser { UserName = "Foo" };
store.Setup(s => s.Update(user, CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable();
var validator = new Mock<UserValidator<TestUser, string>>();
var userManager = new UserManager<TestUser, string>(store.Object);
validator.Setup(v => v.Validate(userManager, user, CancellationToken.None)).Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
userManager.UserValidator = validator.Object;
// Act
var result = await userManager.Update(user);
// Assert
Assert.True(result.Succeeded);
store.VerifyAll();
}
[Fact]
public async Task FindByIdCallsStore()
{
// Setup
var store = new Mock<IUserStore<TestUser, string>>();
var user = new TestUser { UserName = "Foo" };
store.Setup(s => s.FindById(user.Id, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable();
var userManager = new UserManager<TestUser, string>(store.Object);
// Act
var result = await userManager.FindById(user.Id);
// Assert
Assert.Equal(user, result);
store.VerifyAll();
}
[Fact]
public async Task FindByNameCallsStore()
{
// Setup
var store = new Mock<IUserStore<TestUser, string>>();
var user = new TestUser {UserName="Foo"};
store.Setup(s => s.FindByName(user.UserName, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable();
var userManager = new UserManager<TestUser, string>(store.Object);
// Act
var result = await userManager.FindByName(user.UserName);
// Assert
Assert.Equal(user, result);
store.VerifyAll();
}
#endif
[Fact]
public async Task CheckPasswordWithNullUserReturnsFalse()
@ -372,7 +451,7 @@ namespace Microsoft.AspNet.Identity.Test
{
public const string ErrorMessage = "I'm Bad.";
public Task<IdentityResult> Validate(string password)
public Task<IdentityResult> Validate(string password, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(IdentityResult.Failed(ErrorMessage));
}
@ -389,97 +468,97 @@ namespace Microsoft.AspNet.Identity.Test
IUserRoleStore<TestUser, string>,
IUserSecurityStampStore<TestUser, string>
{
public Task<IList<Claim>> GetClaims(TestUser user)
public Task<IList<Claim>> GetClaims(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<IList<Claim>>(new List<Claim>());
}
public Task AddClaim(TestUser user, Claim claim)
public Task AddClaim(TestUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task RemoveClaim(TestUser user, Claim claim)
public Task RemoveClaim(TestUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task SetEmail(TestUser user, string email)
public Task SetEmail(TestUser user, string email, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<string> GetEmail(TestUser user)
public Task<string> GetEmail(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult("");
}
public Task<bool> GetEmailConfirmed(TestUser user)
public Task<bool> GetEmailConfirmed(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(false);
}
public Task SetEmailConfirmed(TestUser user, bool confirmed)
public Task SetEmailConfirmed(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<TestUser> FindByEmail(string email)
public Task<TestUser> FindByEmail(string email, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestUser>(null);
}
public Task<DateTimeOffset> GetLockoutEndDate(TestUser user)
public Task<DateTimeOffset> GetLockoutEndDate(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(DateTimeOffset.MinValue);
}
public Task SetLockoutEndDate(TestUser user, DateTimeOffset lockoutEnd)
public Task SetLockoutEndDate(TestUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<int> IncrementAccessFailedCount(TestUser user)
public Task<int> IncrementAccessFailedCount(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task ResetAccessFailedCount(TestUser user)
public Task ResetAccessFailedCount(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<int> GetAccessFailedCount(TestUser user)
public Task<int> GetAccessFailedCount(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<bool> GetLockoutEnabled(TestUser user)
public Task<bool> GetLockoutEnabled(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(false);
}
public Task SetLockoutEnabled(TestUser user, bool enabled)
public Task SetLockoutEnabled(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task AddLogin(TestUser user, UserLoginInfo login)
public Task AddLogin(TestUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task RemoveLogin(TestUser user, UserLoginInfo login)
public Task RemoveLogin(TestUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<IList<UserLoginInfo>> GetLogins(TestUser user)
public Task<IList<UserLoginInfo>> GetLogins(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<IList<UserLoginInfo>>(new List<UserLoginInfo>());
}
public Task<TestUser> Find(UserLoginInfo login)
public Task<TestUser> Find(UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestUser>(null);
}
@ -488,102 +567,102 @@ namespace Microsoft.AspNet.Identity.Test
{
}
public Task Create(TestUser user)
public Task Create(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task Update(TestUser user)
public Task Update(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task Delete(TestUser user)
public Task Delete(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<TestUser> FindById(string userId)
public Task<TestUser> FindById(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestUser>(null);
}
public Task<TestUser> FindByName(string userName)
public Task<TestUser> FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<TestUser>(null);
}
public Task SetPasswordHash(TestUser user, string passwordHash)
public Task SetPasswordHash(TestUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<string> GetPasswordHash(TestUser user)
public Task<string> GetPasswordHash(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<string>(null);
}
public Task<bool> HasPassword(TestUser user)
public Task<bool> HasPassword(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(false);
}
public Task SetPhoneNumber(TestUser user, string phoneNumber)
public Task SetPhoneNumber(TestUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<string> GetPhoneNumber(TestUser user)
public Task<string> GetPhoneNumber(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult("");
}
public Task<bool> GetPhoneNumberConfirmed(TestUser user)
public Task<bool> GetPhoneNumberConfirmed(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(false);
}
public Task SetPhoneNumberConfirmed(TestUser user, bool confirmed)
public Task SetPhoneNumberConfirmed(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task AddToRole(TestUser user, string roleName)
public Task AddToRole(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task RemoveFromRole(TestUser user, string roleName)
public Task RemoveFromRole(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<IList<string>> GetRoles(TestUser user)
public Task<IList<string>> GetRoles(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult<IList<string>>(new List<string>());
}
public Task<bool> IsInRole(TestUser user, string roleName)
public Task<bool> IsInRole(TestUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(false);
}
public Task SetSecurityStamp(TestUser user, string stamp)
public Task SetSecurityStamp(TestUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<string> GetSecurityStamp(TestUser user)
public Task<string> GetSecurityStamp(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult("");
}
public Task SetTwoFactorEnabled(TestUser user, bool enabled)
public Task SetTwoFactorEnabled(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<bool> GetTwoFactorEnabled(TestUser user)
public Task<bool> GetTwoFactorEnabled(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(false);
}
@ -591,23 +670,23 @@ namespace Microsoft.AspNet.Identity.Test
private class NoOpTokenProvider : IUserTokenProvider<TestUser, string>
{
public Task<string> Generate(string purpose, UserManager<TestUser, string> manager, TestUser user)
public Task<string> Generate(string purpose, UserManager<TestUser, string> manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult("Test");
}
public Task<bool> Validate(string purpose, string token, UserManager<TestUser, string> manager,
TestUser user)
TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(true);
}
public Task Notify(string token, UserManager<TestUser, string> manager, TestUser user)
public Task Notify(string token, UserManager<TestUser, string> manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(0);
}
public Task<bool> IsValidProviderForUser(UserManager<TestUser, string> manager, TestUser user)
public Task<bool> IsValidProviderForUser(UserManager<TestUser, string> manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(true);
}
@ -622,97 +701,97 @@ namespace Microsoft.AspNet.Identity.Test
IUserLockoutStore<TestUser, string>,
IUserTwoFactorStore<TestUser, string>
{
public Task<IList<Claim>> GetClaims(TestUser user)
public Task<IList<Claim>> GetClaims(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task AddClaim(TestUser user, Claim claim)
public Task AddClaim(TestUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task RemoveClaim(TestUser user, Claim claim)
public Task RemoveClaim(TestUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetEmail(TestUser user, string email)
public Task SetEmail(TestUser user, string email, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<string> GetEmail(TestUser user)
public Task<string> GetEmail(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<bool> GetEmailConfirmed(TestUser user)
public Task<bool> GetEmailConfirmed(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetEmailConfirmed(TestUser user, bool confirmed)
public Task SetEmailConfirmed(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<TestUser> FindByEmail(string email)
public Task<TestUser> FindByEmail(string email, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<DateTimeOffset> GetLockoutEndDate(TestUser user)
public Task<DateTimeOffset> GetLockoutEndDate(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetLockoutEndDate(TestUser user, DateTimeOffset lockoutEnd)
public Task SetLockoutEndDate(TestUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<int> IncrementAccessFailedCount(TestUser user)
public Task<int> IncrementAccessFailedCount(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task ResetAccessFailedCount(TestUser user)
public Task ResetAccessFailedCount(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<int> GetAccessFailedCount(TestUser user)
public Task<int> GetAccessFailedCount(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<bool> GetLockoutEnabled(TestUser user)
public Task<bool> GetLockoutEnabled(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetLockoutEnabled(TestUser user, bool enabled)
public Task SetLockoutEnabled(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task AddLogin(TestUser user, UserLoginInfo login)
public Task AddLogin(TestUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task RemoveLogin(TestUser user, UserLoginInfo login)
public Task RemoveLogin(TestUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<IList<UserLoginInfo>> GetLogins(TestUser user)
public Task<IList<UserLoginInfo>> GetLogins(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<TestUser> Find(UserLoginInfo login)
public Task<TestUser> Find(UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
@ -722,72 +801,72 @@ namespace Microsoft.AspNet.Identity.Test
throw new NotImplementedException();
}
public Task Create(TestUser user)
public Task Create(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task Update(TestUser user)
public Task Update(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task Delete(TestUser user)
public Task Delete(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<TestUser> FindById(string userId)
public Task<TestUser> FindById(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<TestUser> FindByName(string userName)
public Task<TestUser> FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetPasswordHash(TestUser user, string passwordHash)
public Task SetPasswordHash(TestUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<string> GetPasswordHash(TestUser user)
public Task<string> GetPasswordHash(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<bool> HasPassword(TestUser user)
public Task<bool> HasPassword(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetPhoneNumber(TestUser user, string phoneNumber)
public Task SetPhoneNumber(TestUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<string> GetPhoneNumber(TestUser user)
public Task<string> GetPhoneNumber(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<bool> GetPhoneNumberConfirmed(TestUser user)
public Task<bool> GetPhoneNumberConfirmed(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetPhoneNumberConfirmed(TestUser user, bool confirmed)
public Task SetPhoneNumberConfirmed(TestUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task SetTwoFactorEnabled(TestUser user, bool enabled)
public Task SetTwoFactorEnabled(TestUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}
public Task<bool> GetTwoFactorEnabled(TestUser user)
public Task<bool> GetTwoFactorEnabled(TestUser user, CancellationToken cancellationToken = default(CancellationToken))
{
throw new NotImplementedException();
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.Security.Claims" version="0.1-alpha-067" targetFramework="net451" />
</packages>