From 451b8d7a766702226fe1d655c163036ccc0b8b0e Mon Sep 17 00:00:00 2001 From: arichika taniguchi Date: Thu, 14 Aug 2014 17:41:50 +0900 Subject: [PATCH 1/5] Modify Queries --- Src/AspNet.Identity.Oracle/RoleTable.cs | 10 +++++----- Src/AspNet.Identity.Oracle/UserClaimsTable.cs | 8 ++++---- Src/AspNet.Identity.Oracle/UserLoginsTable.cs | 10 +++++----- Src/AspNet.Identity.Oracle/UserRoleTable.cs | 6 +++--- Src/SampleWebSite/SampleWebSite.csproj | 3 +++ Src/SampleWebSite/Web.config | 4 +--- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Src/AspNet.Identity.Oracle/RoleTable.cs b/Src/AspNet.Identity.Oracle/RoleTable.cs index 790d91c..1e86317 100644 --- a/Src/AspNet.Identity.Oracle/RoleTable.cs +++ b/Src/AspNet.Identity.Oracle/RoleTable.cs @@ -27,7 +27,7 @@ public RoleTable(OracleDatabase database) /// public int Delete(string roleId) { - const string commandText = @"DELETE FROM ROLES WHERE ID = :ID"; + const string commandText = @"DELETE FROM ANID2ROLES WHERE ID = :ID"; var parameters = new List { new OracleParameter {ParameterName = "ID", Value = roleId, OracleDbType = OracleDbType.Varchar2 }, @@ -43,7 +43,7 @@ public int Delete(string roleId) /// public int Insert(IdentityRole role) { - const string commandText = @"INSERT INTO ROLES (ID, NAME) VALUES (:ID, :NAME)"; + const string commandText = @"INSERT INTO ANID2ROLES (ID, NAME) VALUES (:ID, :NAME)"; var parameters = new List { new OracleParameter {ParameterName = "ID", Value = role.Id, OracleDbType = OracleDbType.Varchar2 }, @@ -60,7 +60,7 @@ public int Insert(IdentityRole role) /// Role name public string GetRoleName(string roleId) { - const string commandText = @"SELECT NAME FROM ROLES WHERE ID = :ID"; + const string commandText = @"SELECT NAME FROM ANID2ROLES WHERE ID = :ID"; var parameters = new List { new OracleParameter {ParameterName = "ID", Value = roleId, OracleDbType = OracleDbType.Varchar2 }, @@ -77,7 +77,7 @@ public string GetRoleName(string roleId) public string GetRoleId(string roleName) { string roleId = null; - const string commandText = @"SELECT ID FROM ROLES WHERE NAME = :NAME"; + const string commandText = @"SELECT ID FROM ANID2ROLES WHERE NAME = :NAME"; var parameters = new List { new OracleParameter {ParameterName = "NAME", Value = roleName, OracleDbType = OracleDbType.Varchar2 }, @@ -126,7 +126,7 @@ public IdentityRole GetRoleByName(string roleName) public int Update(IdentityRole role) { - const string commandText = @"UPDATE ROLES SET NAME = :NAME WHERE ID = :ID"; + const string commandText = @"UPDATE ANID2ROLES SET NAME = :NAME WHERE ID = :ID"; var parameters = new List { new OracleParameter {ParameterName = "ID", Value = role.Id, OracleDbType = OracleDbType.Varchar2 }, diff --git a/Src/AspNet.Identity.Oracle/UserClaimsTable.cs b/Src/AspNet.Identity.Oracle/UserClaimsTable.cs index bec698e..8440292 100644 --- a/Src/AspNet.Identity.Oracle/UserClaimsTable.cs +++ b/Src/AspNet.Identity.Oracle/UserClaimsTable.cs @@ -29,7 +29,7 @@ public UserClaimsTable(OracleDatabase database) public ClaimsIdentity FindByUserId(string userId) { var claims = new ClaimsIdentity(); - const string commandText = @"SELECT * FROM USERCLAIMS WHERE USERID = :USERID"; + const string commandText = @"SELECT * FROM ANID2USERCLAIMS WHERE USERID = :USERID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 }, @@ -51,7 +51,7 @@ public ClaimsIdentity FindByUserId(string userId) /// public int Delete(string userId) { - const string commandText = @"DELETE FROM USERCLAIMS WHERE USERID = :USERID"; + const string commandText = @"DELETE FROM ANID2USERCLAIMS WHERE USERID = :USERID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 }, @@ -68,7 +68,7 @@ public int Delete(string userId) /// public int Insert(Claim claim, string userId) { - const string commandText = @"INSERT INTO USERCLAIMS (CLAIMVALUE, CLAIMTYPE, USERID) VALUES (:VALUE, :TYPE, :USERID)"; + const string commandText = @"INSERT INTO ANID2USERCLAIMS (CLAIMVALUE, CLAIMTYPE, USERID) VALUES (:VALUE, :TYPE, :USERID)"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 }, @@ -87,7 +87,7 @@ public int Insert(Claim claim, string userId) /// public int Delete(IdentityUser user, Claim claim) { - const string commandText = @"DELETE FROM USERCLAIMS WHERE USERID = :USERID AND @CLAIMVALUE = :VALUE AND CLAIMTYPE = :TYPE"; + const string commandText = @"DELETE FROM ANID2USERCLAIMS WHERE USERID = :USERID AND @CLAIMVALUE = :VALUE AND CLAIMTYPE = :TYPE"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = user.Id, OracleDbType = OracleDbType.Varchar2 }, diff --git a/Src/AspNet.Identity.Oracle/UserLoginsTable.cs b/Src/AspNet.Identity.Oracle/UserLoginsTable.cs index fa96244..c8ec4fa 100644 --- a/Src/AspNet.Identity.Oracle/UserLoginsTable.cs +++ b/Src/AspNet.Identity.Oracle/UserLoginsTable.cs @@ -29,7 +29,7 @@ public UserLoginsTable(OracleDatabase database) /// public int Delete(IdentityUser user, UserLoginInfo login) { - const string commandText = @"DELETE FROM USERLOGINS WHERE USERID = :USERID AND LOGINPROVIDER = :LOGINPROVIDER AND PROVIDERKEY = :PROVIDERKEY"; + const string commandText = @"DELETE FROM ANID2USERLOGINS WHERE USERID = :USERID AND LOGINPROVIDER = :LOGINPROVIDER AND PROVIDERKEY = :PROVIDERKEY"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = user.Id, OracleDbType = OracleDbType.Varchar2 }, @@ -47,7 +47,7 @@ public int Delete(IdentityUser user, UserLoginInfo login) /// public int Delete(string userId) { - const string commandText = @"DELETE FROM USERLOGINS WHERE USERID = :USERID"; + const string commandText = @"DELETE FROM ANID2USERLOGINS WHERE USERID = :USERID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 }, @@ -64,7 +64,7 @@ public int Delete(string userId) /// public int Insert(IdentityUser user, UserLoginInfo login) { - const string commandText = @"INSERT INTO USERLOGINS (LOGINPROVIDER, PROVIDERKEY, USERID) VALUES (:LOGINPROVIDER, :PROVIDERKEY, :USERID)"; + const string commandText = @"INSERT INTO ANID2USERLOGINS (LOGINPROVIDER, PROVIDERKEY, USERID) VALUES (:LOGINPROVIDER, :PROVIDERKEY, :USERID)"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = user.Id, OracleDbType = OracleDbType.Varchar2 }, @@ -82,7 +82,7 @@ public int Insert(IdentityUser user, UserLoginInfo login) /// public string FindUserIdByLogin(UserLoginInfo login) { - const string commandText = @"SELECT USERID FROM USERLOGINS WHERE LOGINPROVIDER = :LOGINPROVIDER AND PROVIDERKEY = :PROVIDERKEY"; + const string commandText = @"SELECT USERID FROM ANID2USERLOGINS WHERE LOGINPROVIDER = :LOGINPROVIDER AND PROVIDERKEY = :PROVIDERKEY"; var parameters = new List { new OracleParameter{ ParameterName = "LOGINPROVIDER", Value = login.LoginProvider, OracleDbType = OracleDbType.Varchar2 }, @@ -99,7 +99,7 @@ public string FindUserIdByLogin(UserLoginInfo login) /// public List FindByUserId(string userId) { - const string commandText = @"SELECT * FROM USERLOGINS WHERE USERID = :USERID"; + const string commandText = @"SELECT * FROM ANID2USERLOGINS WHERE USERID = :USERID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 }, diff --git a/Src/AspNet.Identity.Oracle/UserRoleTable.cs b/Src/AspNet.Identity.Oracle/UserRoleTable.cs index f72a386..e334081 100644 --- a/Src/AspNet.Identity.Oracle/UserRoleTable.cs +++ b/Src/AspNet.Identity.Oracle/UserRoleTable.cs @@ -27,7 +27,7 @@ public UserRolesTable(OracleDatabase database) /// public List FindByUserId(string userId) { - const string commandText = @"SELECT ROLES.NAME FROM USERROLES, ROLES WHERE USERROLES.USERID = :USERID AND USERROLES.ROLEID = ROLES.ID"; + const string commandText = @"SELECT ANID2ROLES.NAME FROM ANID2USERROLES, ANID2ROLES WHERE USERID = :USERID AND ANID2USERROLES.ROLEID = ANID2ROLES.ID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 } @@ -45,7 +45,7 @@ public List FindByUserId(string userId) /// public int Delete(string userId) { - const string commandText = @"DELETE FROM USERROLES WHERE USERID = :USERID"; + const string commandText = @"DELETE FROM ANID2USERROLES WHERE USERID = :USERID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 } @@ -62,7 +62,7 @@ public int Delete(string userId) /// public int Insert(IdentityUser user, string roleId) { - const string commandText = @"INSERT INTO USERROLES (USERID, ROLEID) VALUES (:USERID, :ROLEID)"; + const string commandText = @"INSERT INTO ANID2USERROLES (USERID, ROLEID) VALUES (:USERID, :ROLEID)"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = user.Id, OracleDbType = OracleDbType.Varchar2}, diff --git a/Src/SampleWebSite/SampleWebSite.csproj b/Src/SampleWebSite/SampleWebSite.csproj index 96d839b..0329fcc 100644 --- a/Src/SampleWebSite/SampleWebSite.csproj +++ b/Src/SampleWebSite/SampleWebSite.csproj @@ -147,6 +147,9 @@ + + Always + Web.config diff --git a/Src/SampleWebSite/Web.config b/Src/SampleWebSite/Web.config index dde56c6..46675c0 100644 --- a/Src/SampleWebSite/Web.config +++ b/Src/SampleWebSite/Web.config @@ -4,9 +4,7 @@ http://go.microsoft.com/fwlink/?LinkId=169433 を参照してください --> - - - + From a5d9d22bf6d9bb9a107bad4f1ddf81c295658818 Mon Sep 17 00:00:00 2001 From: arichika taniguchi Date: Thu, 14 Aug 2014 18:00:21 +0900 Subject: [PATCH 2/5] Modify Query --- Src/AspNet.Identity.Oracle/UserRoleTable.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/AspNet.Identity.Oracle/UserRoleTable.cs b/Src/AspNet.Identity.Oracle/UserRoleTable.cs index e334081..9560137 100644 --- a/Src/AspNet.Identity.Oracle/UserRoleTable.cs +++ b/Src/AspNet.Identity.Oracle/UserRoleTable.cs @@ -27,7 +27,7 @@ public UserRolesTable(OracleDatabase database) /// public List FindByUserId(string userId) { - const string commandText = @"SELECT ANID2ROLES.NAME FROM ANID2USERROLES, ANID2ROLES WHERE USERID = :USERID AND ANID2USERROLES.ROLEID = ANID2ROLES.ID"; + const string commandText = @"SELECT NAME FROM ANID2USERROLES, ANID2ROLES WHERE USERID = :USERID AND ANID2USERROLES.ROLEID = ANID2ROLES.ID"; var parameters = new List { new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 } From c463124c53a8098df498cd71a26142578670639d Mon Sep 17 00:00:00 2001 From: arichika taniguchi Date: Thu, 14 Aug 2014 18:20:59 +0900 Subject: [PATCH 3/5] Refactoring by ReSharper --- Src/AspNet.Identity.Oracle/RoleStore.cs | 4 +-- Src/AspNet.Identity.Oracle/RoleTable.cs | 3 +-- .../ToDecimalExtentions.cs | 8 +----- Src/AspNet.Identity.Oracle/UserClaimsTable.cs | 2 +- Src/AspNet.Identity.Oracle/UserStore.cs | 26 +++++++++---------- Src/AspNet.Identity.Oracle/UserTable.cs | 6 ++--- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/Src/AspNet.Identity.Oracle/RoleStore.cs b/Src/AspNet.Identity.Oracle/RoleStore.cs index 12c712c..5e21332 100644 --- a/Src/AspNet.Identity.Oracle/RoleStore.cs +++ b/Src/AspNet.Identity.Oracle/RoleStore.cs @@ -70,14 +70,14 @@ public Task FindByIdAsync(string roleId) { var result = roleTable.GetRoleById(roleId) as TRole; - return Task.FromResult(result); + return Task.FromResult(result); } public Task FindByNameAsync(string roleName) { var result = roleTable.GetRoleByName(roleName) as TRole; - return Task.FromResult(result); + return Task.FromResult(result); } public Task UpdateAsync(TRole role) diff --git a/Src/AspNet.Identity.Oracle/RoleTable.cs b/Src/AspNet.Identity.Oracle/RoleTable.cs index 1e86317..afb29c9 100644 --- a/Src/AspNet.Identity.Oracle/RoleTable.cs +++ b/Src/AspNet.Identity.Oracle/RoleTable.cs @@ -76,7 +76,6 @@ public string GetRoleName(string roleId) /// Role's Id public string GetRoleId(string roleName) { - string roleId = null; const string commandText = @"SELECT ID FROM ANID2ROLES WHERE NAME = :NAME"; var parameters = new List { @@ -84,7 +83,7 @@ public string GetRoleId(string roleName) }; var result = _database.QueryValue(commandText, parameters); - return result != null ? Convert.ToString(result) : roleId; + return result != null ? Convert.ToString(result) : null; } /// diff --git a/Src/AspNet.Identity.Oracle/ToDecimalExtentions.cs b/Src/AspNet.Identity.Oracle/ToDecimalExtentions.cs index ee85b27..61a14f6 100644 --- a/Src/AspNet.Identity.Oracle/ToDecimalExtentions.cs +++ b/Src/AspNet.Identity.Oracle/ToDecimalExtentions.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AspNet.Identity.Oracle +namespace AspNet.Identity.Oracle { public static class OracleBoolDecimalExtentions { diff --git a/Src/AspNet.Identity.Oracle/UserClaimsTable.cs b/Src/AspNet.Identity.Oracle/UserClaimsTable.cs index 8440292..dd66539 100644 --- a/Src/AspNet.Identity.Oracle/UserClaimsTable.cs +++ b/Src/AspNet.Identity.Oracle/UserClaimsTable.cs @@ -63,7 +63,7 @@ public int Delete(string userId) /// /// Inserts a new claim in UserClaims table /// - /// User's claim to be added + /// User's claim to be added /// User's id /// public int Insert(Claim claim, string userId) diff --git a/Src/AspNet.Identity.Oracle/UserStore.cs b/Src/AspNet.Identity.Oracle/UserStore.cs index 4bb001c..3c69f4a 100644 --- a/Src/AspNet.Identity.Oracle/UserStore.cs +++ b/Src/AspNet.Identity.Oracle/UserStore.cs @@ -91,9 +91,9 @@ public Task FindByIdAsync(string userId) throw new ArgumentException("Null or empty argument: userId"); } - var result = userTable.GetUserById(userId) as TUser; + var result = userTable.GetUserById(userId); - return Task.FromResult(result ?? null); + return Task.FromResult(result); } /// @@ -108,12 +108,12 @@ public Task FindByNameAsync(string userName) throw new ArgumentException("Null or empty argument: userName"); } - var result = userTable.GetUserByName(userName) as List; + var result = userTable.GetUserByName(userName); // Should I throw if > 1 user? if (result != null && result.Count == 1) { - return Task.FromResult(result[0]); + return Task.FromResult(result[0]); } return Task.FromResult(null); @@ -240,9 +240,9 @@ public Task FindAsync(UserLoginInfo login) var userId = userLoginsTable.FindUserIdByLogin(login); if (userId == null) return Task.FromResult(null); - var user = userTable.GetUserById(userId) as TUser; + var user = userTable.GetUserById(userId); - return Task.FromResult(user ?? null); + return Task.FromResult(user); } /// @@ -259,7 +259,7 @@ public Task> GetLoginsAsync(TUser user) var logins = userLoginsTable.FindByUserId(user.Id); - return Task.FromResult>(logins ?? null); + return Task.FromResult>(logins); } /// @@ -357,11 +357,11 @@ public Task IsInRoleAsync(TUser user, string role) { if (roles != null && roles.Contains(role)) { - return Task.FromResult(true); + return Task.FromResult(true); } } - return Task.FromResult(false); + return Task.FromResult(false); } /// @@ -399,7 +399,7 @@ public Task GetPasswordHashAsync(TUser user) { var passwordHash = userTable.GetPasswordHash(user.Id); - return Task.FromResult(passwordHash); + return Task.FromResult(passwordHash); } /// @@ -411,7 +411,7 @@ public Task HasPasswordAsync(TUser user) { var hasPassword = !string.IsNullOrEmpty(userTable.GetPasswordHash(user.Id)); - return Task.FromResult(Boolean.Parse(hasPassword.ToString())); + return Task.FromResult(Boolean.Parse(hasPassword.ToString())); } /// @@ -513,8 +513,8 @@ public Task FindByEmailAsync(string email) throw new ArgumentNullException("email"); } - var result = userTable.GetUserByEmail(email) as TUser; - return Task.FromResult(result ?? null); + var result = userTable.GetUserByEmail(email).FirstOrDefault(); + return Task.FromResult(result); } /// diff --git a/Src/AspNet.Identity.Oracle/UserTable.cs b/Src/AspNet.Identity.Oracle/UserTable.cs index 9515860..943b473 100644 --- a/Src/AspNet.Identity.Oracle/UserTable.cs +++ b/Src/AspNet.Identity.Oracle/UserTable.cs @@ -60,7 +60,7 @@ public string GetUserId(string userName) /// public TUser GetUserById(string userId) { - TUser user = null; + TUser user; const string commandText = @"SELECT * FROM ANID2USERS WHERE ID = :USERID"; var parameters = new List { @@ -68,7 +68,7 @@ public TUser GetUserById(string userId) }; var rows = _database.Query(commandText, parameters); - if (rows == null || rows.Count != 1) return user; + if (rows == null || rows.Count != 1) return null; var row = rows[0]; user = (TUser)Activator.CreateInstance(typeof(TUser)); @@ -177,7 +177,7 @@ public string GetSecurityStamp(string userId) new OracleParameter{ ParameterName = "USERID", Value = userId, OracleDbType = OracleDbType.Varchar2 } }; - return _database.GetStrValue(commandText, parameters);; + return _database.GetStrValue(commandText, parameters); } /// From 533922adbeb2372f530876411b3147da6aa7e135 Mon Sep 17 00:00:00 2001 From: arichika taniguchi Date: Fri, 15 Aug 2014 00:08:35 +0900 Subject: [PATCH 4/5] Change GUID / ReadMe --- Src/AspNet.Identity.Oracle/Properties/AssemblyInfo.cs | 2 +- Src/AspNet.Identity.Oracle/Readme.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Src/AspNet.Identity.Oracle/Properties/AssemblyInfo.cs b/Src/AspNet.Identity.Oracle/Properties/AssemblyInfo.cs index 4a282a0..8451ac8 100644 --- a/Src/AspNet.Identity.Oracle/Properties/AssemblyInfo.cs +++ b/Src/AspNet.Identity.Oracle/Properties/AssemblyInfo.cs @@ -20,7 +20,7 @@ [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("3BDA7D00-695F-4B52-A835-FEAA2581D21C")] +[assembly: Guid("7403FCE0-1BCC-4DB6-8241-5D8A4FC0FDA1")] // Version information for an assembly consists of the following four values: // diff --git a/Src/AspNet.Identity.Oracle/Readme.txt b/Src/AspNet.Identity.Oracle/Readme.txt index 59d650d..2bb3366 100644 --- a/Src/AspNet.Identity.Oracle/Readme.txt +++ b/Src/AspNet.Identity.Oracle/Readme.txt @@ -1,8 +1,8 @@ -This is an example to implement a OracleDatabase store for ASP.NET Identity updated to use ASP.NET Identity 2.0 +This is an example to implement a OracleDatabase store for ASP.NET Identity 2.0 Steps to run project -- Open project in VS with Update 2 installed +- Open project in VS with Update 2 or later installed - Build project to restore packages and build project - In the solution, add a new one ASP.NET project with MVC and Individual Authentication - Uninstall Microsoft.AspNet.Identity.EntityFramework package from the web application From ae0fad0667e25c3357aa9cb0af3156ef29ffa244 Mon Sep 17 00:00:00 2001 From: arichika taniguchi Date: Fri, 15 Aug 2014 00:59:43 +0900 Subject: [PATCH 5/5] Update README.md --- README.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e74601..f90a1b8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,39 @@ AspNet.Identity.Oracle ====================== -AspNet.Identity.Oracle for ASP.NET Identity 2.0 with ODP.NET +AspNet.Identity.Oracle for ASP.NET Identity 2.0 with ODP.NET +forked from AspNet.Identity.MySQL provided at codeplex. + +https://aspnet.codeplex.com/SourceControl/latest#Samples/Identity/AspNet.Identity.MySQL/AspNet.Identity.MySQL.csproj + +How To Use +========== +(from ReadMe.txt) + +This is an example to implement a OracleDatabase store for ASP.NET Identity 2.0 + +Steps to run project + +- Open project in VS with Update 2 or later installed +- Build project to restore packages and build project +- In the solution, add a new one ASP.NET project with MVC and Individual Authentication +- Uninstall Microsoft.AspNet.Identity.EntityFramework package from the web application +- Update connection string to use the OracleDatabase database as needed +- In the IdentityModel.cs, let ApplicationUser class extend from Identity user in AspNet.Identity.Oracle +- ApplicationDbContext extend from OracleDatabase and the contructor take a single parameter with the connectionstring name +- In the ApplicationManager.Create method, replace instantiating UserManager as shown below + +var manager = new ApplicationUserManager(new UserStore(context.Get() as OracleDatabase)); + +See Also +======== + +AspNet.Identity.MySQL(CodePlex) +https://aspnet.codeplex.com/SourceControl/latest#Samples/Identity/AspNet.Identity.MySQL/AspNet.Identity.MySQL.csproj + +Implementing a Custom MySQL ASP.NET Identity Storage Provider +http://www.asp.net/identity/overview/extensibility/implementing-a-custom-mysql-aspnet-identity-storage-provider + +Announcing RTM of ASP.NET Identity 2.0.0 +http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx +//