AspNetCore.Docs/aspnetcore/security/authentication/add-user-data.md

20 KiB

title author description ms.author ms.date ms.custom uid
Add, download, and delete user data to Identity in an ASP.NET Core project rick-anderson Learn how to add custom user data to Identity in an ASP.NET Core project. Delete data per GDPR. riande 03/15/2022 mvc security/authentication/add-user-data

Add, download, and delete custom user data to Identity in an ASP.NET Core project

By Rick Anderson

This article shows how to:

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)

Prerequisites

:::moniker range=">= aspnetcore-6.0"

[!INCLUDE ]

Create a Razor web app

Visual Studio

  • From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want to it match the namespace of the download sample code.
  • Select ASP.NET Core Web Application > OK
  • Select Web Application > OK
  • Build and run the project.

.NET CLI

dotnet new webapp -o WebApp1

Run the Identity scaffolder

Visual Studio

  • 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 Add.

.NET CLI

If you have not previously installed the ASP.NET Core scaffolder, install it now:

dotnet tool install -g dotnet-aspnet-codegenerator

[!INCLUDE]

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 instruction in Migrations, UseAuthentication, and layout to perform the following steps:

  • Create a migration and update the database.
  • Add UseAuthentication to Program.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 examined the PersonalData.json file.
    • Test the Delete button, which deletes the logged on user.

Add custom user data to the Identity DB

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:

[!code-csharp]

Properties with the PersonalData attribute are:

  • Deleted when the Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml Razor Page calls UserManager.Delete.
  • Included in the downloaded data by the Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml Razor Page.

Update the Account/Manage/Index.cshtml page

Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:

[!code-csharp]

Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:

[!code-cshtml]

Update the Account/Register.cshtml page

Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:

[!code-csharp]

Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:

[!code-cshtml]

Build the project.

Update the layout

See Layout changes for instructions to add sign-in and sign-out links to every page.

Add a migration for the custom user data

Visual Studio

In the Visual Studio Package Manager Console:

Add-Migration CustomUserData
Update-Database

.NET CLI

dotnet ef migrations add CustomUserData
dotnet ef database update

Test create, view, download, delete custom user data

Test the app:

  • Register a new user.
  • View the custom user data on the /Identity/Account/Manage page.
  • Download and view the users personal data from the /Identity/Account/Manage/PersonalData page. :::moniker-end

:::moniker range=">= aspnetcore-3.0 < aspnetcore-6.0"

[!INCLUDE ]

Create a Razor web app

Visual Studio

  • From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want to it match the namespace of the download sample code.
  • Select ASP.NET Core Web Application > OK
  • Select Web Application > OK
  • Build and run the project.

.NET CLI

dotnet new webapp -o WebApp1

Run the Identity scaffolder

Visual Studio

  • 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 Add.

.NET CLI

If you have not previously installed the ASP.NET Core scaffolder, install it now:

dotnet tool install -g dotnet-aspnet-codegenerator

[!INCLUDE]

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 instruction in Migrations, UseAuthentication, and layout to perform the following steps:

  • Create a migration and update the database.
  • Add UseAuthentication to Startup.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 examined the PersonalData.json file.
    • Test the Delete button, which deletes the logged on user.

Add custom user data to the Identity DB

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:

[!code-csharp]

Properties with the PersonalData attribute are:

  • Deleted when the Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml Razor Page calls UserManager.Delete.
  • Included in the downloaded data by the Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml Razor Page.

Update the Account/Manage/Index.cshtml page

Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:

[!code-csharp]

Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:

[!code-cshtml]

Update the Account/Register.cshtml page

Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:

[!code-csharp]

Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:

[!code-cshtml]

Build the project.

Add a migration for the custom user data

Visual Studio

In the Visual Studio Package Manager Console:

Add-Migration CustomUserData
Update-Database

.NET CLI

dotnet ef migrations add CustomUserData
dotnet ef database update

Test create, view, download, delete custom user data

Test the app:

  • Register a new user.
  • View the custom user data on the /Identity/Account/Manage page.
  • Download and view the users personal data from the /Identity/Account/Manage/PersonalData page.

Add claims to Identity using IUserClaimsPrincipalFactory<ApplicationUser>

[!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"

[!INCLUDE ]

Create a Razor web app

Visual Studio

  • From the Visual Studio File menu, select New > Project. Name the project WebApp1 if you want to it 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.

.NET CLI

dotnet new webapp -o WebApp1

Run the Identity scaffolder

Visual Studio

  • 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 Add.

.NET CLI

If you have not previously installed the ASP.NET Core scaffolder, install it now:

dotnet tool install -g dotnet-aspnet-codegenerator

[!INCLUDE]

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 instruction in Migrations, UseAuthentication, and layout to perform the following steps:

  • Create a migration and update the database.
  • Add UseAuthentication to Startup.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 examined the PersonalData.json file.
    • Test the Delete button, which deletes the logged on user.

Add custom user data to the Identity DB

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:

[!code-csharp]

Properties with the PersonalData attribute are:

  • Deleted when the Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml Razor Page calls UserManager.Delete.
  • Included in the downloaded data by the Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml Razor Page.

Update the Account/Manage/Index.cshtml page

Update the InputModel in Areas/Identity/Pages/Account/Manage/Index.cshtml.cs with the following highlighted code:

[!code-csharp]

Update the Areas/Identity/Pages/Account/Manage/Index.cshtml with the following highlighted markup:

[!code-cshtml]

Update the Account/Register.cshtml page

Update the InputModel in Areas/Identity/Pages/Account/Register.cshtml.cs with the following highlighted code:

[!code-csharp]

Update the Areas/Identity/Pages/Account/Register.cshtml with the following highlighted markup:

[!code-cshtml]

Build the project.

Add a migration for the custom user data

Visual Studio

In the Visual Studio Package Manager Console:

Add-Migration CustomUserData
Update-Database

.NET CLI

dotnet ef migrations add CustomUserData
dotnet ef database update

Test create, view, download, delete custom user data

Test the app:

  • Register a new user.
  • View the custom user data on the /Identity/Account/Manage page.
  • Download and view the users personal data from the /Identity/Account/Manage/PersonalData page.

:::moniker-end