| title | Add, download, and delete user data to Identity in an ASP.NET Core project |
|---|---|
| ai-usage | ai-assisted |
| author | wadepickett |
| description | Learn how to add custom user data to Identity in an ASP.NET Core project. Delete data per GDPR. |
| ms.author | wpickett |
| ms.custom | mvc |
| ms.date | 04/02/2026 |
| uid | security/authentication/add-user-data |
This article shows how to:
- Add custom user data to an ASP.NET Core web app.
- Mark the custom user data model with the xref:Microsoft.AspNetCore.Identity.PersonalDataAttribute attribute so it's automatically available for download and deletion. Making the data able to be downloaded and deleted helps meet GDPR requirements.
The project sample is created from a Razor Pages web app, but the instructions are similar for an ASP.NET Core MVC web app.
View or download sample code (how to download)
:::moniker range=">= aspnetcore-10.0"
For the common case of adding two custom properties such as FirstName and LastName:
- Create a new ASP.NET Core project with Individual Accounts authentication
- Scaffold Identity to override the Register and Manage/Index pages
- Add custom properties such as
FirstNameandLastNameto the user class, with the[PersonalData]attribute. - Update the Register and Manage/Index pages to include input fields for your properties
- Create and apply a migration
- Test registration and profile management
The sections below provide detailed step-by-step instructions for this process.
You can create either a Razor Pages or MVC web app. Both use the same Identity Razor Pages UI.
- From the Visual Studio File menu, select New > Project/Solution....
- Select ASP.NET Core Web App (Razor Pages) > Next
- Name the project WebApp1 if you want it to match the namespace of the download sample code. Select Next.
- Select Authentication type > Individual Accounts > Create
- Build and run the project.
dotnet new webapp -au Individual -o WebApp1
- From the Visual Studio File menu, select New > Project/Solution....
- Select ASP.NET Core Web App (Model-View-Controller) > Next
- Name the project WebApp1 if you want it to match the namespace of the download sample code. Select Next.
- Select Authentication type > Individual Accounts > Create
- Build and run the project.
dotnet new mvc -au Individual -o WebApp1
Note
Identity UI is implemented as a Razor Class Library. When you create an MVC project with authentication, the Identity pages are served from the Razor Class Library, which means your MVC project uses Razor Pages for Identity even though the rest of the project uses MVC controllers and views.
- From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
- From the left pane of the Add Scaffold dialog, select Identity > Add.
- In the Add Identity dialog, the following options:
- Select the existing layout file
~/Pages/Shared/_Layout.cshtmlfor Razor Pages or~/Views/Shared/_Layout.cshtmlfor MVC - Select the following files to override:
- Account/Register
- Account/Manage/Index
- Select the + button to create a new Data context class. Accept the type (WebApp1.Models.WebApp1Context if the project is named WebApp1).
- Select the + button to create a new User class. Accept the type (WebApp1User if the project is named WebApp1) > Add.
- Select the existing layout file
- Select Add.
If you have not previously installed the ASP.NET Core scaffolder, install it now:
dotnet tool install -g dotnet-aspnet-codegenerator
Add a package reference to Microsoft.VisualStudio.Web.CodeGeneration.Design to the project (.csproj) file. Run the following command in the project directory:
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore
Run the following command to list the Identity scaffolder options:
dotnet aspnet-codegenerator identity -h
In the project folder, run the Identity scaffolder:
dotnet aspnet-codegenerator identity -u WebApp1User -fi Account.Register;Account.Manage.Index
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semi-colons in the file list or put the file list in double quotes.
Follow the instructions in Migrations, UseAuthentication, and layout to perform the following steps:
- Create a migration and update the database.
- Add
UseAuthenticationtoProgram.cs - Add
<partial name="_LoginPartial" />to the layout file. - Test the app:
- Register a user
- Select the new user name (next to the Logout link). You might need to expand the window or select the navigation bar icon to show the user name and other links.
- Select the Personal Data tab.
- Select the Download button and examine the
PersonalData.jsonfile. - Test the Delete button, which deletes the logged on user.
Update the IdentityUser derived class with custom properties. If you named the project WebApp1, the file is named Areas/Identity/Data/WebApp1User.cs. Update the file with the following code:
Properties with the PersonalData attribute are:
- Deleted when the
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtmlRazor Page callsUserManager.Delete. - Included in the downloaded data by the
Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtmlRazor Page.
Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:
Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:
Build the project.
See Layout changes for instructions to add sign-in and sign-out links to every page.
In the Visual Studio Package Manager Console:
Add-Migration CustomUserData
Update-Databasedotnet ef migrations add CustomUserData
dotnet ef database update
Test the app:
- Register a new user.
- View the custom user data on the
/Identity/Account/Managepage. - Download and view the users personal data from the
/Identity/Account/Manage/PersonalDatapage.
If you encounter issues:
| Symptom | Likely Cause | Solution |
|---|---|---|
| Custom fields don't appear in registration form | Forgot to update Register.cshtml | Ensure you've scaffolded and modified Areas/Identity/Pages/Account/Register.cshtml |
| Custom data not saving | Forgot to add migration or update database | Run dotnet ef migrations add CustomUserData then dotnet ef database update |
| Custom fields not in downloaded data | Missing [PersonalData] attribute |
Add [PersonalData] attribute to properties in your user class |
| Build errors after scaffolding | Package version mismatch | Ensure all Identity packages match your target framework version |
:::moniker-end
:::moniker range=">= aspnetcore-9.0 < aspnetcore-10.0"
Note
The code samples and instructions for .NET 9 reference the 10.x sample folder. The code is identical between .NET 9 and .NET 10 for this scenario. Only the target framework and package versions differ in the project file.
For the common case of adding two custom properties such as FirstName and LastName:
- Create a new ASP.NET Core project with Individual Accounts authentication
- Scaffold Identity to override the Register and Manage/Index pages
- Add custom properties such as
FirstNameandLastNameto the user class, with the[PersonalData]attribute. - Update the Register and Manage/Index pages to include input fields for your properties
- Create and apply a migration
- Test registration and profile management
The sections below provide detailed step-by-step instructions for this process.
You can create either a Razor Pages or MVC web app. Both use the same Identity Razor Pages UI.
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web App > Next
- Select Authentication type > Individual Accounts > Create
- Build and run the project.
dotnet new webapp -au Individual -o WebApp1
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web App (Model-View-Controller) > Next
- Select Authentication type > Individual Accounts > Create
- Build and run the project.
dotnet new mvc -au Individual -o WebApp1
Note
Identity UI is implemented as a Razor Class Library. When you create an MVC project with authentication, the Identity pages are served from the Razor Class Library, which means your MVC project uses Razor Pages for Identity even though the rest of the project uses MVC controllers and views.
- From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
- From the left pane of the Add Scaffold dialog, select Identity > Add.
- In the Add Identity dialog, the following options:
- Select the existing layout file
~/Pages/Shared/_Layout.cshtmlfor Razor Pages or~/Views/Shared/_Layout.cshtmlfor MVC - Select the following files to override:
- Account/Register
- Account/Manage/Index
- Select the + button to create a new Data context class. Accept the type (WebApp1.Models.WebApp1Context if the project is named WebApp1).
- Select the + button to create a new User class. Accept the type (WebApp1User if the project is named WebApp1) > Add.
- Select the existing layout file
- Select Add.
If you have not previously installed the ASP.NET Core scaffolder, install it now:
dotnet tool install -g dotnet-aspnet-codegenerator
Add a package reference to Microsoft.VisualStudio.Web.CodeGeneration.Design to the project (.csproj) file. Run the following command in the project directory:
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore
Run the following command to list the Identity scaffolder options:
dotnet aspnet-codegenerator identity -h
In the project folder, run the Identity scaffolder:
dotnet aspnet-codegenerator identity -u WebApp1User -fi Account.Register;Account.Manage.Index
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semi-colons in the file list or put the file list in double quotes.
Follow the instructions in Migrations, UseAuthentication, and layout to perform the following steps:
- Create a migration and update the database.
- Add
UseAuthenticationtoProgram.cs - Add
<partial name="_LoginPartial" />to the layout file. - Test the app:
- Register a user
- Select the new user name (next to the Logout link). You might need to expand the window or select the navigation bar icon to show the user name and other links.
- Select the Personal Data tab.
- Select the Download button and examine the
PersonalData.jsonfile. - Test the Delete button, which deletes the logged on user.
Update the IdentityUser derived class with custom properties. If you named the project WebApp1, the file is named Areas/Identity/Data/WebApp1User.cs. Update the file with the following code:
Properties with the PersonalData attribute are:
- Deleted when the
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtmlRazor Page callsUserManager.Delete. - Included in the downloaded data by the
Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtmlRazor Page.
Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:
Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:
Build the project.
See Layout changes for instructions to add sign-in and sign-out links to every page.
In the Visual Studio Package Manager Console:
Add-Migration CustomUserData
Update-Databasedotnet ef migrations add CustomUserData
dotnet ef database update
Test the app:
- Register a new user.
- View the custom user data on the
/Identity/Account/Managepage. - Download and view the users personal data from the
/Identity/Account/Manage/PersonalDatapage.
If you encounter issues:
| Symptom | Likely Cause | Solution |
|---|---|---|
| Custom fields don't appear in registration form | Forgot to update Register.cshtml | Ensure you've scaffolded and modified Areas/Identity/Pages/Account/Register.cshtml |
| Custom data not saving | Forgot to add migration or update database | Run dotnet ef migrations add CustomUserData then dotnet ef database update |
| Custom fields not in downloaded data | Missing [PersonalData] attribute |
Add [PersonalData] attribute to properties in your user class |
| Build errors after scaffolding | Package version mismatch | Ensure all Identity packages match your target framework version |
:::moniker-end
:::moniker range=">= aspnetcore-8.0 < aspnetcore-9.0"
Note
The code samples and instructions for .NET 8 reference the 10.x sample folder. The code is identical between .NET 8 and .NET 10 for this scenario. Only the target framework and package versions differ in the project file.
For a simple scenario where you want to add just a couple of custom properties, such as FirstName and LastName to your Identity user:
- Create a new ASP.NET Core project with Individual Accounts authentication
- Scaffold Identity to override the Register and Manage/Index pages
- Add your custom properties to the user class (e.g.,
FirstName,LastName) with the[PersonalData]attribute - Update the Register and Manage/Index pages to include input fields for your properties
- Create and apply a migration
- Test registration and profile management
The sections below provide detailed step-by-step instructions for this process.
You can create either a Razor Pages or MVC web app. Both use the same Identity Razor Pages UI.
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web App > Next
- Select Authentication type > Individual Accounts > Create
- Build and run the project.
dotnet new webapp -au Individual -o WebApp1
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web App (Model-View-Controller) > Next
- Select Authentication type > Individual Accounts > Create
- Build and run the project.
dotnet new mvc -au Individual -o WebApp1
Note
Identity UI is implemented as a Razor Class Library. When you create an MVC project with authentication, the Identity pages are served from the Razor Class Library, which means your MVC project uses Razor Pages for Identity even though the rest of the project uses MVC controllers and views.
- From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
- From the left pane of the Add Scaffold dialog, select Identity > Add.
- In the Add Identity dialog, the following options:
- Select the existing layout file
~/Pages/Shared/_Layout.cshtmlfor Razor Pages or~/Views/Shared/_Layout.cshtmlfor MVC - Select the following files to override:
- Account/Register
- Account/Manage/Index
- Select the + button to create a new Data context class. Accept the type (WebApp1.Models.WebApp1Context if the project is named WebApp1).
- Select the + button to create a new User class. Accept the type (WebApp1User if the project is named WebApp1) > Add.
- Select the existing layout file
- Select Add.
If you have not previously installed the ASP.NET Core scaffolder, install it now:
dotnet tool install -g dotnet-aspnet-codegenerator
Add a package reference to Microsoft.VisualStudio.Web.CodeGeneration.Design to the project (.csproj) file. Run the following command in the project directory:
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore
Run the following command to list the Identity scaffolder options:
dotnet aspnet-codegenerator identity -h
In the project folder, run the Identity scaffolder:
dotnet aspnet-codegenerator identity -u WebApp1User -fi Account.Register;Account.Manage.Index
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semi-colons in the file list or put the file list in double quotes.
Follow the instructions in Migrations, UseAuthentication, and layout to perform the following steps:
- Create a migration and update the database.
- Add
UseAuthenticationtoProgram.cs - Add
<partial name="_LoginPartial" />to the layout file. - Test the app:
- Register a user
- Select the new user name (next to the Logout link). You might need to expand the window or select the navigation bar icon to show the user name and other links.
- Select the Personal Data tab.
- Select the Download button and examine the
PersonalData.jsonfile. - Test the Delete button, which deletes the logged on user.
Update the IdentityUser derived class with custom properties. If you named the project WebApp1, the file is named Areas/Identity/Data/WebApp1User.cs. Update the file with the following code:
Properties with the PersonalData attribute are:
- Deleted when the
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtmlRazor Page callsUserManager.Delete. - Included in the downloaded data by the
Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtmlRazor Page.
Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:
Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:
Build the project.
See Layout changes for instructions to add sign-in and sign-out links to every page.
In the Visual Studio Package Manager Console:
Add-Migration CustomUserData
Update-Databasedotnet ef migrations add CustomUserData
dotnet ef database update
Test the app:
- Register a new user.
- View the custom user data on the
/Identity/Account/Managepage. - Download and view the users personal data from the
/Identity/Account/Manage/PersonalDatapage.
If you encounter issues:
| Symptom | Likely Cause | Solution |
|---|---|---|
| Custom fields don't appear in registration form | Forgot to update Register.cshtml | Ensure you've scaffolded and modified Areas/Identity/Pages/Account/Register.cshtml |
| Custom data not saving | Forgot to add migration or update database | Run dotnet ef migrations add CustomUserData then dotnet ef database update |
| Custom fields not in downloaded data | Missing [PersonalData] attribute |
Add [PersonalData] attribute to properties in your user class |
| Build errors after scaffolding | Package version mismatch | Ensure all Identity packages match your target framework version |
:::moniker-end
:::moniker range=">= aspnetcore-6.0 < aspnetcore-8.0"
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web Application > OK
- Select Web Application > OK
- Build and run the project.
dotnet new webapp -o WebApp1
- From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
- From the left pane of the Add Scaffold dialog, select Identity > Add.
- In the Add Identity dialog, the following options:
- Select the existing layout file
~/Pages/Shared/_Layout.cshtml - Select the following files to override:
- Account/Register
- Account/Manage/Index
- Select the + button to create a new Data context class. Accept the type (WebApp1.Models.WebApp1Context if the project is named WebApp1).
- Select the + button to create a new User class. Accept the type (WebApp1User if the project is named WebApp1) > Add.
- Select the existing layout file
- Select Add.
If you have not previously installed the ASP.NET Core scaffolder, install it now:
dotnet tool install -g dotnet-aspnet-codegenerator
Add a package reference to Microsoft.VisualStudio.Web.CodeGeneration.Design to the project (.csproj) file. Run the following command in the project directory:
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore
Run the following command to list the Identity scaffolder options:
dotnet aspnet-codegenerator identity -h
In the project folder, run the Identity scaffolder:
dotnet aspnet-codegenerator identity -u WebApp1User -fi Account.Register;Account.Manage.Index
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semi-colons in the file list or put the file list in double quotes.
Follow the instructions in Migrations, UseAuthentication, and layout to perform the following steps:
- Create a migration and update the database.
- Add
UseAuthenticationtoProgram.cs - Add
<partial name="_LoginPartial" />to the layout file. - Test the app:
- Register a user
- Select the new user name (next to the Logout link). You might need to expand the window or select the navigation bar icon to show the user name and other links.
- Select the Personal Data tab.
- Select the Download button and examine the
PersonalData.jsonfile. - Test the Delete button, which deletes the logged on user.
Update the IdentityUser derived class with custom properties. If you named the project WebApp1, the file is named Areas/Identity/Data/WebApp1User.cs. Update the file with the following code:
Properties with the PersonalData attribute are:
- Deleted when the
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtmlRazor Page callsUserManager.Delete. - Included in the downloaded data by the
Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtmlRazor Page.
Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:
Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:
Build the project.
See Layout changes for instructions to add sign-in and sign-out links to every page.
In the Visual Studio Package Manager Console:
Add-Migration CustomUserData
Update-Databasedotnet ef migrations add CustomUserData
dotnet ef database update
Test the app:
- Register a new user.
- View the custom user data on the
/Identity/Account/Managepage. - Download and view the users personal data from the
/Identity/Account/Manage/PersonalDatapage. :::moniker-end
:::moniker range=">= aspnetcore-3.0 < aspnetcore-6.0"
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web Application > OK
- Select Web Application > OK
- Build and run the project.
dotnet new webapp -o WebApp1
- From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
- From the left pane of the Add Scaffold dialog, select Identity > Add.
- In the Add Identity dialog, the following options:
- Select the existing layout file
~/Pages/Shared/_Layout.cshtml - Select the following files to override:
- Account/Register
- Account/Manage/Index
- Select the + button to create a new Data context class. Accept the type (WebApp1.Models.WebApp1Context if the project is named WebApp1).
- Select the + button to create a new User class. Accept the type (WebApp1User if the project is named WebApp1) > Add.
- Select the existing layout file
- Select Add.
If you have not previously installed the ASP.NET Core scaffolder, install it now:
dotnet tool install -g dotnet-aspnet-codegenerator
Add a package reference to Microsoft.VisualStudio.Web.CodeGeneration.Design to the project (.csproj) file. Run the following command in the project directory:
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore
Run the following command to list the Identity scaffolder options:
dotnet aspnet-codegenerator identity -h
In the project folder, run the Identity scaffolder:
dotnet aspnet-codegenerator identity -u WebApp1User -fi Account.Register;Account.Manage.Index
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semi-colons in the file list or put the file list in double quotes.
Follow the instructions in Migrations, UseAuthentication, and layout to perform the following steps:
- Create a migration and update the database.
- Add
UseAuthenticationtoStartup.Configure. - Add
<partial name="_LoginPartial" />to the layout file. - Test the app:
- Register a user
- Select the new user name (next to the Logout link). You might need to expand the window or select the navigation bar icon to show the user name and other links.
- Select the Personal Data tab.
- Select the Download button and examine the
PersonalData.jsonfile. - Test the Delete button, which deletes the logged on user.
Update the IdentityUser derived class with custom properties. If you named the project WebApp1, the file is named Areas/Identity/Data/WebApp1User.cs. Update the file with the following code:
Properties with the PersonalData attribute are:
- Deleted when the
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtmlRazor Page callsUserManager.Delete. - Included in the downloaded data by the
Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtmlRazor Page.
Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:
Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:
Build the project.
In the Visual Studio Package Manager Console:
Add-Migration CustomUserData
Update-Databasedotnet ef migrations add CustomUserData
dotnet ef database update
Test the app:
- Register a new user.
- View the custom user data on the
/Identity/Account/Managepage. - Download and view the users personal data from the
/Identity/Account/Manage/PersonalDatapage.
Note
This section isn't an extension of the previous tutorial. To apply the following steps to the app built using the tutorial, see this GitHub issue.
Additional claims can be added to ASP.NET Core Identity by using the IUserClaimsPrincipalFactory<T> interface. This class can be added to the app in the Startup.ConfigureServices method. Add the custom implementation of the class as follows:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>,
AdditionalUserClaimsPrincipalFactory>();The demo code uses the ApplicationUser class. This class adds an IsAdmin property which is used to add the additional claim.
public class ApplicationUser : IdentityUser
{
public bool IsAdmin { get; set; }
}The AdditionalUserClaimsPrincipalFactory implements the UserClaimsPrincipalFactory interface. A new role claim is added to the ClaimsPrincipal.
public class AdditionalUserClaimsPrincipalFactory
: UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public AdditionalUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager, optionsAccessor)
{}
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
var identity = (ClaimsIdentity)principal.Identity;
var claims = new List<Claim>();
if (user.IsAdmin)
{
claims.Add(new Claim(JwtClaimTypes.Role, "admin"));
}
else
{
claims.Add(new Claim(JwtClaimTypes.Role, "user"));
}
identity.AddClaims(claims);
return principal;
}
}The additional claim can then be used in the app. In a Razor Page, the IAuthorizationService instance can be used to access the claim value.
@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService
@if ((await AuthorizationService.AuthorizeAsync(User, "IsAdmin")).Succeeded)
{
<ul class="mr-auto navbar-nav">
<li class="nav-item">
<a class="nav-link" asp-controller="Admin" asp-action="Index">ADMIN</a>
</li>
</ul>
}:::moniker-end
:::moniker range="< aspnetcore-3.0"
- From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want it to match the namespace of the download sample code.
- Select ASP.NET Core Web Application > OK
- Select ASP.NET Core 2.2 in the dropdown
- Select Web Application > OK
- Build and run the project.
dotnet new webapp -o WebApp1
- From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
- From the left pane of the Add Scaffold dialog, select Identity > Add.
- In the Add Identity dialog, the following options:
- Select the existing layout file
~/Pages/Shared/_Layout.cshtml - Select the following files to override:
- Account/Register
- Account/Manage/Index
- Select the + button to create a new Data context class. Accept the type (WebApp1.Models.WebApp1Context if the project is named WebApp1).
- Select the + button to create a new User class. Accept the type (WebApp1User if the project is named WebApp1) > Add.
- Select the existing layout file
- Select Add.
If you have not previously installed the ASP.NET Core scaffolder, install it now:
dotnet tool install -g dotnet-aspnet-codegenerator
Add a package reference to Microsoft.VisualStudio.Web.CodeGeneration.Design to the project (.csproj) file. Run the following command in the project directory:
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore
Run the following command to list the Identity scaffolder options:
dotnet aspnet-codegenerator identity -h
In the project folder, run the Identity scaffolder:
dotnet aspnet-codegenerator identity -u WebApp1User -fi Account.Register;Account.Manage.Index
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semi-colons in the file list or put the file list in double quotes.
Follow the instructions in Migrations, UseAuthentication, and layout to perform the following steps:
- Create a migration and update the database.
- Add
UseAuthenticationtoStartup.Configure. - Add
<partial name="_LoginPartial" />to the layout file. - Test the app:
- Register a user
- Select the new user name (next to the Logout link). You might need to expand the window or select the navigation bar icon to show the user name and other links.
- Select the Personal Data tab.
- Select the Download button and examine the
PersonalData.jsonfile. - Test the Delete button, which deletes the logged on user.
Update the IdentityUser derived class with custom properties. If you named the project WebApp1, the file is named Areas/Identity/Data/WebApp1User.cs. Update the file with the following code:
Properties with the PersonalData attribute are:
- Deleted when the
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtmlRazor Page callsUserManager.Delete. - Included in the downloaded data by the
Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtmlRazor Page.
Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:
Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:
Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:
Build the project.
The custom properties added to the WebApp1User Identity user class need to be reflected in the database. A migration is needed now to generate the SQL required to add the new columns, and then the database needs to be updated to apply those changes.
The Identity scaffolder created a new DbContext (WebApp1Context) alongside the original ApplicationDbContext from the project template. You must specify the new WebApp1Context Identity DbContext to use when running migration commands.
In the Visual Studio Package Manager Console:
Add-Migration CustomUserData -Context WebApp1Context
Update-Database -Context WebApp1Contextdotnet ef migrations add CustomUserData --context WebApp1Context
dotnet ef database update --context WebApp1Context
Test the app:
- Register a new user.
- View the custom user data on the
/Identity/Account/Managepage. - Download and view the users personal data from the
/Identity/Account/Manage/PersonalDatapage.
:::moniker-end