Your official information source from the .NET Web Development and Tools group at Microsoft.
Today, we are releasing the final version of ASP.NET Identity 2.0. The main focus in this release was to add security and account management features as well as address feedback from the community.
You can download ASP.NET Identity from the NuGet gallery. You can install or update to these packages through NuGet using the NuGet Package Manager Console, like this:
Following is the list of features and major issues that were fixed in 2.0.0.
ASP.NET Identity now support two-factor authentication. Two-factor authentication provides an extra layer of security to your user accounts in the case where your password gets compromised. Most websites protect their data by having a user create an account on their website with a username and password. Passwords are not very secure and sometimes users choose weak passwords which can lead to user accounts being compromised.
SMS is the preferred way of sending codes but you can also use email in case the user does not have access to their phone. You can extend and write your own providers such as QR code generators and use Authenticator apps on phones to validate them.
There is also protection for brute force attacks against the two factor codes. If a user enters incorrect codes for a specified amount of time then the user account will be locked out for a specified amount of time. These values are configurable.
To try out this feature, you can install ASP.NET Identity Samples NuGet package (in an Empty ASP.NET app) and follow the steps to configure and run the project.
Provide a way to Lockout out the user if the user enters their password or two-factor codes incorrectly. The number of invalid attempts and the timespan for the users are locked out can be configured. A developer can optionally turn off Account Lockout for certain user accounts should they need to.
The ASP.NET Identity system now supports Account Confirmation by confirming the email of the user. This is a fairly common scenario in most websites today where when you register for a new account on the website, you are required to confirm your email before you could do anything in the website. Email Confirmation is useful because it prevents bogus accounts from being created. This is extremely useful if you are using email as a method of communicating with the users of your website such as Forum sites, banking, ecommerce, social web sites.
Note: To send emails you can configure SMTP Server or use some of the popular email services such as SendGrid (http://sendgrid.com/windowsazure.html) which integrate nicely with Windows Azure and require no configuration on the application developer
In the sample project below, you need to hook up the Email service for sending emails. You will not be able to reset your password until you confirm your account
Password Reset is a feature where the user can reset their passwords if they have forgotten their password.
Support a way to regenerate the Security Stamp for the user in cases when the User changes their password or any other security related information such as removing an associated login(such as Facebook, Google, Microsoft Account etc). This is needed to ensure that any tokens (cookies) generated with the old password are invalidated. In the sample project, if you change the users password then a new token is generated for the user and any previous tokens are invalidated.
This feature provides an extra layer of security to your application since when you change your password, you will be logged out where you have logged into this application. You can also extend this to Sign out from all places where you have logged in from. This sample shows how to do it.
You can configure this in Startup.Auth.cs by registering a CookieAuthenticationProvider as follows.
In 1.0 the type of PK for Users and Roles was strings. This means when the ASP.NET Identity system was persisted in Sql Server using Entity Framework, we were using nvarchar. There were lots of discussions around this default implementation on Stack Overflow and based on the incoming feedback, we have provided an extensibility hook where you can specify what should be the PK of your Users and Roles table. This extensibility hook is particularly useful if you are migrating your application and the application was storing UserIds are GUIDs or ints.
Since you are changing the type of PK for Users and Roles, you need to plug in the corresponding classes for Claims, Logins which take in the correct PK. Following is a snippet of code which shows how you can change the PK to be int
For a full working sample please see https://aspnet.codeplex.com/SourceControl/latest#Samples/Identity/ChangePK/readme.txt
We have added support for IQueryable on UsersStore and RolesStore so you can easily get the list of Users and Roles.
For eg. the following code uses the IQueryable and shows how you can get the list of Users from UserManager. You can do the same for getting list of Roles from RoleManager
In 1.0, if you had to delete a User, you could not do it through the UserManager. We have fixed this issue in this release so you can do the following to delete a user
You can use Factory implementation to get an instance of UserManager from the OWIN context. This pattern is similar to what we use for getting AuthenticationManager from OWIN context for SignIn and SignOut. This is a recommended way of getting an instance of UserManager per request for the application.
Following snippet of code shows how you can configure this middleware in StartupAuth.cs. This is in the sample project listed below.
Following snippet of code shows how you can get an instance of UserManager
ASP.NET Identity uses EntityFramework for persisting the Identity system in Sql Server. To do this the Identity System has a reference to the ApplicationDbContext. The DbContextFactory Middleware returns you an instance of the ApplicationDbContext per request which you can use in your application.
Following code shows how you can configure it in StartupAuth.cs. The code for this middleware is in the sample project.
In ASP.NET Identity Entity Framework implementation, we have added a unique index on the Username using the new IndexAttribute in EF 6.1.0. We did this to ensure that Usernames are always unique and there was no race condition in which you could end up with duplicate usernames.
The password validator that was shipped in ASP.NET Identity 1.0 was a fairly basic password validator which was only validating the minimum length. There is a new password validator which gives you more control over the complexity of the password. Please note that even if you turn on all the settings in this password, we do encourage you to enable two-factor authentication for the user accounts.
You can also add Password policies as per your own requirements. The following sample shows you how you can extend Identity for this scenario. https://aspnet.codeplex.com/SourceControl/latest#Samples/Identity/Identity-PasswordPolicy/Identity-PasswordPolicy/Readme.txt
We are releasing a Samples NuGet package to make it easier to install samples for ASP.NET Identity. This is a sample ASP.NET MVC application. Please modify the code to suit your application before you deploy this in production. The sample should be installed in an Empty ASP.NET application.
Following are the features in this samples package
The sample is still in preview since we are still working on improving the sample and fixing issues with it but it is in a state where you can easily see how to add ASP.NET Identity features in an application.
ASP.NET Identity 2.0.0 depends upon Entity Framework 6.1.0 which was also released earlier in the week. For more details please read this announcement post.
You can look at all the bugs that were fixed in this release by clicking this link.
If you are migrating from ASP.NET Identity 1.0 to 2.0.0, then please refer to this article on how you can use Entity Framework Code First migrations to migrate your database http://blogs.msdn.com/b/webdev/archive/2013/12/20/updating-asp-net-applications-from-asp-net-identity-1-0-to-2-0-0-alpha1.aspx
This article is based on migrating to ASP.NET Identity 2.0.0-alpha1 but the same steps apply to ASP.NET Identity 2.0.0
Following are some changes to be aware of while migrating
Following are the changes you will have to make to your application if you are upgrading from 2.0.0-Beta1 to 2.0.0 of Identity.
Thank You for trying out the previews and your feedback for ASP.NET Identity. Please let us know your feedback around ASP.NET Identity
@Maximilian the ASP.NET templates will be updated with these packages in Visual Studio 2013 Update2
@tbertenshaw please use the packages that have been published on the NuGet gallery.
@Neilski there are Web Forms samples on aspnetidentity.codeplex.com. Also the ASP.NET templates for Web Forms, MVC, Web API and SPA will be updated with these packages
@Reisier the Web Forms templates in VS Update2 will be updated to use these packages. We also have samples on aspnetidentity.codeplex.com
Are you looking for a specific sample?
Thank's Pranav for the info,
I'm in a serious moment of near to deploy to production of a new project, and wanted to go clean with version 2 of identity! Unfortunally the webforms are left for 2nd plan, but in my opinion it's the worng strategy... that's another talk...
I'm trying to assemble a webforms v2.0 identity project, from the v2 MVC sample and the primarykeysconfigtest, but i'm having trouble on the login part, recognizing the loginview control to be autenticated! I'm using the "PasswordSignIn" function but it appears that the cookie it's not changed accordingly with the succces of the function! i tried also the "SignInAsync" but it's the same effect!
@Pranav finally i got there! Thanks.
Hi Pranav, thank you for your response. I am basically looking for the Web Forms equivalent of the MVC code found in the samples package you referenced at the beginning of your blog 'Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2'.
I tried your suggestion of looking on aspnetidentity.codeplex.com but I was unable to find any samples relating to web forms identity version 2.0 (I actually couldn't find any sample code at this site).
Failing available samples, can you give any indication of when the AspNet Templates will be updated with the latest code?
1. What's with the Register functionality in the samples? I tried to register new account and keeps saying "Passwords must have at least one non letter or digit character."
So I tried "Something123" for password and it doesn't work. I debugged and figured out the Model validates fine (there is no password complexity constraint on the RegisterViewModel) but UserManager returns an error and above message. So I tried with a special character "#" and it worked.
Seems to me another case of sloppy programming, either remove the constraints or provide correct error messages.
2. Where is the documentation on Password Reset? By looking at samples I can see how the stuff works but what about details? How long is the password reset link valid? Where is the token stored (it is not in the database, I can see that) and how do the GenerateToken and subsequent Confirmation work?
This is just for starters, I only scratched the surface..
Why are these in beta if this post is about the RTM of ASP.NET Identity 2.0? I'm a little bit confused.
Install-Package Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2 –Pre
Shouldn't be there an option in ApplicationUserManager, something like AllowLoginWithoutConfirmation where we couldn't allow anybody to log-in till the email is confirmed? At the moment, you can register with a bogus email and login if I am right, without clicking on confirmation link. Thanks :)
Also, another update. If you manage to register and login without confirmation then you cannot reset your password..
@Vaclav, Account confirmation flow is very specific to the app. For eg. you could allow users to login without confirming the account, but when they do something sensitive such as place an order, they will not be able to do it unless they confirm their email. In the samples package you can login without confirming your email but you cannot reset your password unless you have confirmed your email
@centiva, when you register a new user then the password validator is used to validate the password. We are using stronger passwords so the password characters need to have one of each character as specified in the Password validator.
We are working on more docs, but you can look at the Samples package to see how the features work. If you have more questions please discuss them on Stack Overflow
@Neilski, We will provide a samples for Web Forms this week. The VS templates will be updated with Visual Studio 2013 Update2
Is it possible to set any settings to DataProtectorTokenProvider or DataProtectionProvider?
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
manager.UserTokenProvider = new DataProtectorTokenProvider<UserAccount>(dataProtectionProvider.Create("ASP.NET Identity"));
We would like to be able to generate tokens that contain only lowercase letters, since we use everything lowercase only (routes) and when the token is included in the password reset link (that gets sent over email) the token is turned into lowercase only subsequently failing later upon verification.