Skip to content

Commit b4050da

Browse files
prep identity for V6 monikers (dotnet#23268)
* prep identity for V6 monikers * prep identity for V6 monikers
1 parent 612315e commit b4050da

File tree

1 file changed

+109
-59
lines changed

1 file changed

+109
-59
lines changed

aspnetcore/security/authentication/identity.md

+109-59
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ uid: security/authentication/identity
99
---
1010
# Introduction to Identity on ASP.NET Core
1111

12-
::: moniker range=">= aspnetcore-3.0"
12+
<!-- DO NOT PR this until RC1 branch merges -->
13+
::: moniker range=">= aspnetcore-6.0"
1314

1415
By [Rick Anderson](https://twitter.com/RickAndMSFT)
1516

@@ -106,22 +107,6 @@ Run the app and register a user. Depending on your screen size, you might need t
106107

107108
Services are added in `ConfigureServices`. The typical pattern is to call all the `Add{Service}` methods, and then call all the `services.Configure{Service}` methods.
108109

109-
::: moniker-end
110-
111-
::: moniker range=">= aspnetcore-3.0 < aspnetcore-5.0"
112-
113-
[!code-csharp[](identity/sample/WebApp3/Startup.cs?name=snippet_configureservices&highlight=11-99)]
114-
115-
The preceding highlighted code configures Identity with default option values. Services are made available to the app through [dependency injection](xref:fundamentals/dependency-injection).
116-
117-
Identity is enabled by calling <xref:Microsoft.AspNetCore.Builder.AuthAppBuilderExtensions.UseAuthentication*>. `UseAuthentication` adds authentication [middleware](xref:fundamentals/middleware/index) to the request pipeline.
118-
119-
[!code-csharp[](identity/sample/WebApp3/Startup.cs?name=snippet_configure&highlight=19)]
120-
121-
::: moniker-end
122-
123-
::: moniker range=">= aspnetcore-5.0"
124-
125110
[!code-csharp[](identity/sample/WebApp5x/Startup.cs?name=snippet_configureservices&highlight=12-99)]
126111

127112
The preceding code configures Identity with default option values. Services are made available to the app through [dependency injection](xref:fundamentals/dependency-injection).
@@ -130,10 +115,6 @@ Identity is enabled by calling [UseAuthentication](/dotnet/api/microsoft.aspnetc
130115

131116
[!code-csharp[](identity/sample/WebApp5x/Startup.cs?name=snippet_configure&highlight=19)]
132117

133-
::: moniker-end
134-
135-
::: moniker range=">= aspnetcore-3.0"
136-
137118
The template-generated app doesn't use [authorization](xref:security/authorization/secure-data). `app.UseAuthorization` is included to ensure it's added in the correct order should the app add authorization. `UseRouting`, `UseAuthentication`, `UseAuthorization`, and `UseEndpoints` must be called in the order shown in the preceding code.
138119

139120
For more information on `IdentityOptions` and `Startup`, see <xref:Microsoft.AspNetCore.Identity.IdentityOptions> and [Application Startup](xref:fundamentals/startup).
@@ -275,29 +256,35 @@ To prevent publishing static Identity assets (stylesheets and JavaScript files f
275256

276257
::: moniker-end
277258

278-
::: moniker range="< aspnetcore-3.0"
259+
::: moniker range=">= aspnetcore-3.0 < aspnetcore-6.0"
279260

280261
By [Rick Anderson](https://twitter.com/RickAndMSFT)
281262

282-
ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. Users can create an account with the login information stored in Identity or they can use an external login provider. Supported external login providers include [Facebook, Google, Microsoft Account, and Twitter](xref:security/authentication/social/index).
263+
ASP.NET Core Identity:
283264

284-
Identity can be configured using a SQL Server database to store user names, passwords, and profile data. Alternatively, another persistent store can be used, for example, Azure Table Storage.
265+
* Is an API that supports user interface (UI) login functionality.
266+
* Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.
285267

286-
[View or download the sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/security/authentication/identity/sample/src/ASPNETCore-IdentityDemoComplete/) ([how to download](xref:index#how-to-download-a-sample)).
268+
Users can create an account with the login information stored in Identity or they can use an external login provider. Supported external login providers include [Facebook, Google, Microsoft Account, and Twitter](xref:security/authentication/social/index).
287269

288-
In this topic, you learn how to use Identity to register, log in, and log out a user. For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.
270+
[!INCLUDE[](~/includes/requireAuth.md)]
289271

290-
<a name="adi"></a>
272+
The [Identity source code](https://github.com/dotnet/AspNetCore/tree/main/src/Identity) is available on GitHub. [Scaffold Identity](xref:security/authentication/scaffold-identity) and view the generated files to review the template interaction with Identity.
291273

292-
## AddDefaultIdentity and AddIdentity
274+
Identity is typically configured using a SQL Server database to store user names, passwords, and profile data. Alternatively, another persistent store can be used, for example, Azure Table Storage.
293275

294-
<xref:Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity*> was introduced in ASP.NET Core 2.1. Calling `AddDefaultIdentity` is similar to calling the following:
276+
In this topic, you learn how to use Identity to register, log in, and log out a user. Note: the templates treat username and email as the same for users. For more detailed instructions about creating apps that use Identity, see [Next Steps](#next).
295277

296-
* <xref:Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity*>
297-
* <xref:Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI*>
298-
* <xref:Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddDefaultTokenProviders*>
278+
[Microsoft identity platform](/azure/active-directory/develop/) is:
299279

300-
See [AddDefaultIdentity source](https://github.com/dotnet/AspNetCore/blob/release/2.1/src/Identity/UI/src/IdentityServiceCollectionUIExtensions.cs#L47-L63) for more information.
280+
* An evolution of the Azure Active Directory (Azure AD) developer platform.
281+
* Unrelated to ASP.NET Core Identity.
282+
283+
[!INCLUDE[](~/includes/IdentityServer4.md)]
284+
285+
[View or download the sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/security/authentication/identity/sample) ([how to download](xref:index#how-to-download-a-sample)).
286+
287+
<a name="adi"></a>
301288

302289
## Create a Web app with authentication
303290

@@ -316,6 +303,12 @@ Create an ASP.NET Core Web Application project with Individual User Accounts.
316303
dotnet new webapp --auth Individual -o WebApp1
317304
```
318305

306+
The preceding command creates a Razor web app using SQLite. To create the web app with LocalDB, run the following command:
307+
308+
```dotnetcli
309+
dotnet new webapp --auth Individual -uld -o WebApp1
310+
```
311+
319312
---
320313

321314
The generated project provides [ASP.NET Core Identity](xref:security/authentication/identity) as a [Razor Class Library](xref:razor-pages/ui-class). The Identity Razor Class Library exposes endpoints with the `Identity` area. For example:
@@ -332,12 +325,16 @@ Apply the migrations to initialize the database.
332325

333326
Run the following command in the Package Manager Console (PMC):
334327

335-
```powershell
336-
Update-Database
337-
```
328+
`PM> Update-Database`
338329

339330
# [.NET Core CLI](#tab/netcore-cli)
340331

332+
Migrations are not necessary at this step when using SQLite.
333+
334+
[!INCLUDE [more information on the CLI for EF Core](~/includes/ef-cli.md)]
335+
336+
For LocalDB, run the following command:
337+
341338
```dotnetcli
342339
dotnet ef database update
343340
```
@@ -356,53 +353,75 @@ Run the app and register a user. Depending on your screen size, you might need t
356353

357354
Services are added in `ConfigureServices`. The typical pattern is to call all the `Add{Service}` methods, and then call all the `services.Configure{Service}` methods.
358355

356+
::: moniker-end
357+
358+
::: moniker range=">= aspnetcore-3.0 < aspnetcore-5.0"
359+
360+
[!code-csharp[](identity/sample/WebApp3/Startup.cs?name=snippet_configureservices&highlight=11-99)]
361+
362+
The preceding highlighted code configures Identity with default option values. Services are made available to the app through [dependency injection](xref:fundamentals/dependency-injection).
363+
364+
Identity is enabled by calling <xref:Microsoft.AspNetCore.Builder.AuthAppBuilderExtensions.UseAuthentication*>. `UseAuthentication` adds authentication [middleware](xref:fundamentals/middleware/index) to the request pipeline.
365+
366+
[!code-csharp[](identity/sample/WebApp3/Startup.cs?name=snippet_configure&highlight=19)]
367+
368+
::: moniker-end
369+
370+
::: moniker range=">= aspnetcore-5.0 < aspnetcore-6.0"
371+
372+
[!code-csharp[](identity/sample/WebApp5x/Startup.cs?name=snippet_configureservices&highlight=12-99)]
373+
359374
The preceding code configures Identity with default option values. Services are made available to the app through [dependency injection](xref:fundamentals/dependency-injection).
360375

361376
Identity is enabled by calling [UseAuthentication](/dotnet/api/microsoft.aspnetcore.builder.authappbuilderextensions.useauthentication#Microsoft_AspNetCore_Builder_AuthAppBuilderExtensions_UseAuthentication_Microsoft_AspNetCore_Builder_IApplicationBuilder_). `UseAuthentication` adds authentication [middleware](xref:fundamentals/middleware/index) to the request pipeline.
362377

363-
[!code-csharp[](identity/sample/WebApp1/Startup.cs?name=snippet_configure&highlight=18)]
378+
[!code-csharp[](identity/sample/WebApp5x/Startup.cs?name=snippet_configure&highlight=19)]
364379

365-
For more information, see the [IdentityOptions Class](/dotnet/api/microsoft.aspnetcore.identity.identityoptions) and [Application Startup](xref:fundamentals/startup).
380+
::: moniker-end
366381

367-
## Scaffold Register, Login, and LogOut
382+
::: moniker range=">= aspnetcore-3.0 < aspnetcore-6.0"
368383

369-
Follow the [Scaffold identity into a Razor project with authorization](xref:security/authentication/scaffold-identity#scaffold-identity-into-a-razor-project-with-authorization) instructions to generate the code shown in this section.
384+
The template-generated app doesn't use [authorization](xref:security/authorization/secure-data). `app.UseAuthorization` is included to ensure it's added in the correct order should the app add authorization. `UseRouting`, `UseAuthentication`, `UseAuthorization`, and `UseEndpoints` must be called in the order shown in the preceding code.
385+
386+
For more information on `IdentityOptions` and `Startup`, see <xref:Microsoft.AspNetCore.Identity.IdentityOptions> and [Application Startup](xref:fundamentals/startup).
387+
388+
## Scaffold Register, Login, LogOut, and RegisterConfirmation
370389

371390
# [Visual Studio](#tab/visual-studio)
372391

373-
Add the Register, Login, and LogOut files.
392+
Add the `Register`, `Login`, `LogOut`, and `RegisterConfirmation` files. Follow the [Scaffold identity into a Razor project with authorization](xref:security/authentication/scaffold-identity#scaffold-identity-into-a-razor-project-with-authorization) instructions to generate the code shown in this section.
374393

375394
# [.NET Core CLI](#tab/netcore-cli)
376395

377-
If you created the project with name **WebApp1**, run the following commands. Otherwise, use the correct namespace for the `ApplicationDbContext`:
378-
379-
When using SQLite, `--useSqLite` must be specified:
396+
If you created the project with name **WebApp1**, and you're not using SQLite, run the following commands. Otherwise, use the correct namespace for the `ApplicationDbContext`:
380397

381398
```dotnetcli
382399
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
383-
dotnet aspnet-codegenerator identity -dc WebApp1.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout" --useSqLite
400+
dotnet aspnet-codegenerator identity -dc WebApp1.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout;Account.RegisterConfirmation"
384401
```
385402

386-
With SQL Express, use the following commands:
403+
When using SQLite, append `--useSqlite` or `-sqlite`:
387404

388405
```dotnetcli
389-
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
390-
dotnet aspnet-codegenerator identity -dc WebApp1.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout"
406+
dotnet aspnet-codegenerator identity -dc WebAppAuth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout;Account.RegisterConfirmation" --useSqlite
391407
```
392408

393409
PowerShell uses semicolon as a command separator. When using PowerShell, escape the semicolons in the file list or put the file list in double quotes, as the preceding example shows.
394410

411+
For more information on scaffolding Identity, see [Scaffold identity into a Razor project with authorization](xref:security/authentication/scaffold-identity#scaffold-identity-into-a-razor-project-with-authorization).
412+
395413
---
396414

397415
### Examine Register
398416

399-
When a user clicks the **Register** link, the `RegisterModel.OnPostAsync` action is invoked. The user is created by [CreateAsync](/dotnet/api/microsoft.aspnetcore.identity.usermanager-1.createasync#Microsoft_AspNetCore_Identity_UserManager_1_CreateAsync__0_System_String_) on the `_userManager` object:
400-
401-
[!code-csharp[](identity/sample/WebApp1/Areas/Identity/Pages/Account/Register.cshtml.cs?name=snippet&highlight=7)]
417+
When a user clicks the **Register** button on the `Register` page, the `RegisterModel.OnPostAsync` action is invoked. The user is created by [CreateAsync](/dotnet/api/microsoft.aspnetcore.identity.usermanager-1.createasync#Microsoft_AspNetCore_Identity_UserManager_1_CreateAsync__0_System_String_) on the `_userManager` object:
402418

403-
If the user was created successfully, the user is logged in by the call to `_signInManager.SignInAsync`.
419+
[!code-csharp[](identity/sample/WebApp3/Areas/Identity/Pages/Account/Register.cshtml.cs?name=snippet&highlight=9)]
404420

405-
**Note:** See [account confirmation](xref:security/authentication/accconfirm#prevent-login-at-registration) for steps to prevent immediate login at registration.
421+
<!-- .NET 5 fixes this, see
422+
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs#L74-L77
423+
-->
424+
[!INCLUDE[](~/includes/disableVer.md)]
406425

407426
### Log in
408427

@@ -413,27 +432,29 @@ The Login form is displayed when:
413432

414433
When the form on the Login page is submitted, the `OnPostAsync` action is called. `PasswordSignInAsync` is called on the `_signInManager` object.
415434

416-
[!code-csharp[](identity/sample/WebApp1/Areas/Identity/Pages/Account/Login.cshtml.cs?name=snippet&highlight=10-11)]
435+
[!code-csharp[](identity/sample/WebApp3/Areas/Identity/Pages/Account/Login.cshtml.cs?name=snippet&highlight=10-11)]
417436

418437
For information on how to make authorization decisions, see <xref:security/authorization/introduction>.
419438

420439
### Log out
421440

422441
The **Log out** link invokes the `LogoutModel.OnPost` action.
423442

424-
[!code-csharp[](identity/sample/WebApp1/Areas/Identity/Pages/Account/Logout.cshtml.cs)]
443+
[!code-csharp[](identity/sample/WebApp3/Areas/Identity/Pages/Account/Logout.cshtml.cs?highlight=36)]
444+
445+
In the preceding code, the code `return RedirectToPage();` needs to be a redirect so that the browser performs a new request and the identity for the user gets updated.
425446

426447
[SignOutAsync](/dotnet/api/microsoft.aspnetcore.identity.signinmanager-1.signoutasync#Microsoft_AspNetCore_Identity_SignInManager_1_SignOutAsync) clears the user's claims stored in a cookie.
427448

428449
Post is specified in the *Pages/Shared/_LoginPartial.cshtml*:
429450

430-
[!code-cshtml[](identity/sample/WebApp1/Pages/Shared/_LoginPartial.cshtml?highlight=16)]
451+
[!code-cshtml[](identity/sample/WebApp3/Pages/Shared/_LoginPartial.cshtml?highlight=15)]
431452

432453
## Test Identity
433454

434-
The default web project templates allow anonymous access to the home pages. To test Identity, add [`[Authorize]`](/dotnet/api/microsoft.aspnetcore.authorization.authorizeattribute) to the Privacy page.
455+
The default web project templates allow anonymous access to the home pages. To test Identity, add [`[Authorize]`](xref:Microsoft.AspNetCore.Authorization.AuthorizeAttribute):
435456

436-
[!code-csharp[](identity/sample/WebApp1/Pages/Privacy.cshtml.cs?highlight=7)]
457+
[!code-csharp[](identity/sample/WebApp3/Pages/Privacy.cshtml.cs?highlight=7)]
437458

438459
If you are signed in, sign out. Run the app and select the **Privacy** link. You are redirected to the login page.
439460

@@ -446,7 +467,7 @@ To explore Identity in more detail:
446467

447468
## Identity Components
448469

449-
All the Identity dependent NuGet packages are included in the [Microsoft.AspNetCore.App metapackage](xref:fundamentals/metapackage-app).
470+
All the Identity-dependent NuGet packages are included in the [ASP.NET Core shared framework](xref:aspnetcore-3.0#use-the-aspnet-core-shared-framework).
450471

451472
The primary package for Identity is [Microsoft.AspNetCore.Identity](https://www.nuget.org/packages/Microsoft.AspNetCore.Identity/). This package contains the core set of interfaces for ASP.NET Core Identity, and is included by `Microsoft.AspNetCore.Identity.EntityFrameworkCore`.
452473

@@ -458,8 +479,37 @@ For more information and guidance on migrating your existing Identity store, see
458479

459480
See [Configuration](#pw) for a sample that sets the minimum password requirements.
460481

482+
## AddDefaultIdentity and AddIdentity
483+
484+
<xref:Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity*> was introduced in ASP.NET Core 2.1. Calling `AddDefaultIdentity` is similar to calling the following:
485+
486+
* <xref:Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity*>
487+
* <xref:Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI*>
488+
* <xref:Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddDefaultTokenProviders*>
489+
490+
See [AddDefaultIdentity source](https://github.com/dotnet/AspNetCore/blob/release/3.1/src/Identity/UI/src/IdentityServiceCollectionUIExtensions.cs#L47-L63) for more information.
491+
492+
## Prevent publish of static Identity assets
493+
494+
To prevent publishing static Identity assets (stylesheets and JavaScript files for Identity UI) to the web root, add the following `ResolveStaticWebAssetsInputsDependsOn` property and `RemoveIdentityAssets` target to the app's project file:
495+
496+
```xml
497+
<PropertyGroup>
498+
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
499+
</PropertyGroup>
500+
501+
<Target Name="RemoveIdentityAssets">
502+
<ItemGroup>
503+
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
504+
</ItemGroup>
505+
</Target>
506+
```
507+
508+
<a name="next"></a>
509+
461510
## Next Steps
462511

512+
* [ASP.NET Core Identity source code](https://github.com/dotnet/aspnetcore/tree/main/src/Identity)
463513
* See [this GitHub issue](https://github.com/dotnet/AspNetCore.Docs/issues/5131) for information on configuring Identity using SQLite.
464514
* [Configure Identity](xref:security/authentication/identity-configuration)
465515
* <xref:security/authorization/secure-data>

0 commit comments

Comments
 (0)