generování uživatelského rozhraní Identity v ASP.NET Corech projektech

Autor: Rick Anderson

ASP.NET Core poskytuje ASP.NET Core Identity jako Razor knihovnu tříd. Aplikace, které zahrnují, Identity mohou použít generátory k selektivnímu Přidání zdrojového kódu obsaženého v Identity Razor knihovně tříd (RCL). Můžete chtít generovat zdrojový kód, abyste mohli kód upravit a změnit chování. Můžete například dát generátoru pokyn, aby vygeneroval kód používaný při registraci. Generovaný kód má přednost před stejným kódem v Identity RCL. Pokud chcete získat úplnou kontrolu nad uživatelským rozhraním a nepoužívat výchozí RCL, přečtěte si část Vytvoření úplného Identity zdroje uživatelského rozhraní.

Aplikace, které neobsahují ověřování, můžou pro přidání balíčku RCL použít generování uživatelského rozhraní Identity . Máte možnost vybrat Identity kód, který se má vygenerovat.

I když generátor generuje většinu potřebného kódu, je nutné aktualizovat projekt, aby bylo možné proces dokončit. Tento dokument popisuje kroky potřebné k dokončení Identity aktualizace generování uživatelského rozhraní.

Doporučujeme používat systém správy zdrojového kódu, který zobrazuje rozdíly mezi soubory a umožňuje zálohování změn. Zkontrolujte změny po spuštění nástroje pro Identity generování uživatelského rozhraní.

Služby jsou vyžadovány při použití dvou ověření, potvrzení účtu a obnovení heslaa dalších funkcí zabezpečení s nástrojem Identity . Služby nebo zástupné procedury služby nejsou generovány při generování uživatelského rozhraní Identity . Služby, které umožňují tyto funkce povolit, je nutné přidat ručně. Podívejte se například na příkaz vyžadovat potvrzení e-mailu.

Při generování uživatelského rozhraní Identity s novým kontextem dat do projektu se stávajícími jednotlivými účty:

  • V nástroji Startup.ConfigureServices odeberte volání na:
    • AddDbContext
    • AddDefaultIdentity

Například AddDbContext a AddDefaultIdentity jsou zakomentovány v následujícím kódu:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddDbContext<ApplicationDbContext>(options =>
    //    options.UseSqlServer(
    //        Configuration.GetConnectionString("DefaultConnection")));
    //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    //    .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
}

Předchozí kód komentáře kódu, který je duplikován v oblasti/ Identity / Identity HostingStartup. cs

Aplikace, které byly vytvořeny pomocí jednotlivých účtů , by obvykle neměly vytvářet nový kontext dat.

Uživatelské rozhraní Identity do prázdného projektu

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Aktualizujte Startup třídu podobným kódem jako v následujícím příkladu:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Generování uživatelského rozhraní Identity do Razor projektu bez existující autorizace

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Identityje nakonfigurovaný v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Migrace, UseAuthentication a rozložení

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Povolit ověřování

Aktualizujte Startup třídu podobným kódem jako v následujícím příkladu:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Změny rozložení

Volitelné: přidejte do souboru rozložení částečnou přihlašování ( _LoginPartial ):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Generování uživatelského rozhraní Identity do Razor projektu s autorizací

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, aby se soubor rozložení přepsal nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky nebo projekty s existující Blazor Server Razor infrastrukturou Pages
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC nebo Blazor Server projekty s existující infrastrukturou MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, jinak se soubor rozložení přepíše nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor Stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Některé Identity Možnosti jsou nakonfigurovány v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Generování uživatelského rozhraní Identity do projektu MVC bez existující autorizace

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Volitelné: přidejte částečné přihlášení ( _LoginPartial ) do souboru views/Shared/_Layout. cshtml :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Přesuňte soubor Pages/Shared/_LoginPartial. cshtml do views/shared/_LoginPartial. cshtml

Identityje nakonfigurovaný v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Aktualizujte Startup třídu podobným kódem jako v následujícím příkladu:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Generování uživatelského rozhraní Identity do projektu MVC s autorizací

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, aby se soubor rozložení přepsal nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky nebo projekty s existující Blazor Server Razor infrastrukturou Pages
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC nebo Blazor Server projekty s existující infrastrukturou MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, jinak se soubor rozložení přepíše nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor Stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Generování uživatelského rozhraní Identity do Blazor Server projektu bez existující autorizace

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Identityje nakonfigurovaný v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Migrace

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Předání tokenu XSRF do aplikace

Tokeny lze předat součástem:

  • Při zřizování ověřovacích tokenů a jejich uložení do ověřování je cookie možné je předat součástem.
  • Razor komponenty nemůžou používat HttpContext přímo, takže neexistuje žádný způsob, jak získat token pro padělání žádostí o odeslání na Identity koncový bod odhlašovacího objektu na adrese /Identity/Account/Logout . Token XSRF lze předat komponentám.

Další informace naleznete v tématu Blazor ServerASP.NET Core další scénáře zabezpečení.

V souboru Pages/_Host. cshtml vytvořte token po jeho přidání do InitialApplicationState TokenProvider tříd a:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

Aktualizujte App komponentu (App. Razor), abyste přiřadili InitialState.XsrfToken :

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

Služba, která TokenProvider je znázorněna v tématu, se používá v LoginDisplay části v následujícím oddílu rozložení a změny toku ověřování .

Povolit ověřování

Ve Startup třídě:

  • Potvrďte, že Razor jsou do služby přidány stránky Startup.ConfigureServices .
  • Pokud používáte TokenProvider, zaregistrujte službu.
  • Zavolejte UseDatabaseErrorPage na tvůrce aplikací v nástroji Startup.Configure pro vývojové prostředí.
  • Volání UseAuthentication a UseAuthorization After UseRouting .
  • Přidejte koncový bod pro Razor stránky.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddScoped<TokenProvider>();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Změny toku rozložení a ověřování

Přidejte RedirectToLogin komponentu (RedirectToLogin. Razor) do sdílené složky aplikace v kořenu projektu:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

Přidejte LoginDisplay součást (LoginDisplay. Razor) do sdílené složky aplikace. Služba TokenProvider poskytuje token XSRF pro formulář HTML, který odesílá do Identity koncového bodu pro odhlášení:

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

Do MainLayout komponenty (Shared/MainLayout. Razor) přidejte LoginDisplay komponentu do obsahu elementu horního řádku <div> :

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Koncové body ověřování stylu

Vzhledem k tomu Blazor Server Razor , že nástroj používá stránky stránky Identity , styl uživatelského rozhraní se změní, když návštěvník prochází mezi Identity stránkami a komponentami. Máte dvě možnosti, jak adresovat incongruous styly:

IdentityKomponenty sestavení

Přístup k používání komponent Identity místo stránek je vytvoření Identity komponent. Vzhledem SignInManager UserManager k tomu, že součásti nejsou podporovány v Razor součástech, použijte koncové body rozhraní API v Blazor Server aplikaci ke zpracování akcí uživatelských účtů.

Použití vlastního rozložení pomocí Blazor stylů aplikací

IdentityRozložení a styly stránek lze upravit tak, aby vytvořily stránky, které používají výchozí Blazor motiv.

Poznámka

Příklad v této části je pouze výchozím bodem pro přizpůsobení. Pro nejlepší uživatelské prostředí se nejspíš vyžaduje další práce.

Vytvoří novou NavMenu_IdentityLayout součást (Shared/NavMenu_ Identity layout. Razor). Pro značky a kód součásti použijte stejný obsah NavMenu součásti aplikace (Shared/NavMenu. Razor). Vydejte všechny NavLink součásti, které se nedají získat anonymně, protože automatické přesměrování v RedirectToLogin součásti selžou pro součásti, které vyžadují ověřování nebo autorizaci.

V souboru Pages/Shared/layout. cshtml proveďte následující změny:

  • Přidejte Razor do horní části souboru direktivy pro použití pomocníků značek a součástí aplikace ve sdílené složce:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    Nahraďte {APPLICATION ASSEMBLY} názvem sestavení aplikace.

  • Přidat <base> značku a Blazor šablonu stylů <link> k <head> obsahu:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • Změňte obsah <body> značky na následující:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Generování uživatelského rozhraní Identity do Blazor Server projektu s autorizací

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, aby se soubor rozložení přepsal nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky nebo projekty s existující Blazor Server Razor infrastrukturou Pages
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC nebo Blazor Server projekty s existující infrastrukturou MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, jinak se soubor rozložení přepíše nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor Stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Některé Identity Možnosti jsou nakonfigurovány v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Samostatné nebo hostované Blazor WebAssembly aplikace

Aplikace na straně klienta Blazor WebAssembly využívají vlastní Identity uživatelské rozhraní a nemůžou používat ASP.NET Core Identity generování uživatelského rozhraní. ASP.NET Core aplikace hostovaných řešení na straně serveru Blazor se můžou řídit Razor pokyny pro stránky a MVC v tomto článku a nakonfigurují se stejně jako jakýkoli jiný typ aplikace ASP.NET Core, která podporuje Identity .

Rozhraní Blazor neobsahuje Razor verze komponent Identity stránek uživatelského rozhraní. Identity Součásti uživatelského rozhraní Razor lze vytvořit nebo získat z nepodporovaných zdrojů třetích stran.

Další informace najdete v Blazor článku zabezpečení a Identity články.

Vytvořit úplný Identity zdroj uživatelského rozhraní

Chcete-li zachovat úplnou kontrolu nad Identity uživatelským rozhraním, spusťte modul pro Identity generování uživatelského rozhraní a vyberte možnost přepsat všechny soubory.

následující zvýrazněný kód ukazuje změny, které nahradí výchozí Identity uživatelské rozhraní Identity ve webové aplikaci ASP.NET Core 2,1. To může být vhodné, pokud chcete mít úplnou kontrolu nad Identity uživatelským rozhraním.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

Výchozí hodnota Identity je nahrazena následujícím kódem:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Následující kód nastaví LoginPath, LogoutPatha AccessDeniedPath:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Zaregistrujte IEmailSender implementaci, například:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

Konfigurace hesla

Pokud PasswordOptions jsou nakonfigurovány v Startup.ConfigureServices , může být pro [StringLength] Password vlastnost v generovaných stránkách vyžadována konfigurace atributu Identity . InputModel``Passwordvlastnosti se nacházejí v následujících souborech:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Zakázat stránku

V této části se dozvíte, jak zakázat stránku registrace, ale přístup můžete použít k zakázání jakékoli stránky.

Zakázání registrace uživatele:

  • Generování uživatelského rozhraní Identity . Přidejte účet. registr, Account. Login a account. RegisterConfirmation. Například:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aktualizovat oblasti/ Identity /Pages/Account/Register.cshtml.cs , aby se uživatelé nemohli registrovat z tohoto koncového bodu:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualizovat oblasti/ Identity /Pages/Account/Register.cshtml tak, aby byly v souladu s předchozími změnami:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Odkomentujte nebo odeberte odkaz na registraci z oblastí/ Identity /Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Aktualizujte stránku oblasti/ Identity /Pages/Account/RegisterConfirmation .

    • Odeberte kód a odkazy ze souboru CSHTML.
    • Odstraňte potvrzovací kód z PageModel :
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Přidání uživatelů pomocí jiné aplikace

Poskytněte mechanismus pro přidání uživatelů mimo webovou aplikaci. Mezi možnosti přidávání uživatelů patří:

  • Vyhrazená webová aplikace pro správu.
  • Konzolová aplikace.

Následující kód popisuje jeden přístup k přidávání uživatelů:

  • Seznam uživatelů je čten do paměti.
  • Pro každého uživatele je vygenerováno silné jedinečné heslo.
  • Uživatel se přidá do Identity databáze.
  • Uživatel obdrží oznámení a sdělí mu změnu hesla.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Následující osnovy kódu přidávají uživatele:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Podobný přístup je možné vyřídit v produkčních scénářích.

Zabránit publikování statických Identity prostředků

Chcete-li zabránit publikování statických Identity prostředků do kořenového adresáře webu, přečtěte si téma Úvod do Identity ASP.NET Core .

Další zdroje informací

ASP.NET Core 2,1 a novější poskytují ASP.NET Core Identity jako Razor knihovnu tříd. Aplikace, které zahrnují, Identity mohou použít generátory k selektivnímu Přidání zdrojového kódu obsaženého v Identity Razor knihovně tříd (RCL). Můžete chtít generovat zdrojový kód, abyste mohli kód upravit a změnit chování. Můžete například dát generátoru pokyn, aby vygeneroval kód používaný při registraci. Generovaný kód má přednost před stejným kódem v Identity RCL. Pokud chcete získat úplnou kontrolu nad uživatelským rozhraním a nepoužívat výchozí RCL, přečtěte si část Vytvoření úplného zdroje uživatelského rozhraní identity.

Aplikace, které neobsahují ověřování, můžou pro přidání balíčku RCL použít generování uživatelského rozhraní Identity . Máte možnost vybrat Identity kód, který se má vygenerovat.

I když generátor generuje většinu potřebného kódu, budete muset aktualizovat projekt, aby se tento proces dokončil. Tento dokument popisuje kroky potřebné k dokončení Identity aktualizace generování uživatelského rozhraní.

Když se Identity spustí generátor, vytvoří se soubor ScaffoldingReadme.txt v adresáři projektu. Soubor ScaffoldingReadme.txt obsahuje obecné pokyny k tomu, co je potřeba k dokončení Identity aktualizace generování uživatelského rozhraní. Tento dokument obsahuje ucelené pokyny, než ScaffoldingReadme.txt soubor.

Doporučujeme používat systém správy zdrojového kódu, který zobrazuje rozdíly mezi soubory a umožňuje zálohování změn. Zkontrolujte změny po spuštění nástroje pro Identity generování uživatelského rozhraní.

Poznámka

Služby jsou vyžadovány při použití dvou ověření, potvrzení účtu a obnovení heslaa dalších funkcí zabezpečení s nástrojem Identity . Služby nebo zástupné procedury služby nejsou generovány při generování uživatelského rozhraní Identity . Služby, které umožňují tyto funkce povolit, je nutné přidat ručně. Podívejte se například na příkaz vyžadovat potvrzení e-mailu.

Uživatelské rozhraní Identity do prázdného projektu

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Do třídy přidejte následující zvýrazněná volání Startup :

public class Startup
{        
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvc();
    }
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Generování uživatelského rozhraní Identity do Razor projektu bez existující autorizace

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Identityje nakonfigurovaný v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Migrace, UseAuthentication a rozložení

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Povolit ověřování

V Configure metodě Startup třídy volejte UseAuthentication po UseStaticFiles :

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvc();
    }
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Změny rozložení

Volitelné: přidejte do souboru rozložení částečnou přihlašování ( _LoginPartial ):

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorNoAuth8</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">RazorNoAuth8</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - RazorNoAuth8</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

Generování uživatelského rozhraní Identity do Razor projektu s autorizací

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, aby se soubor rozložení přepsal nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky nebo projekty s existující Blazor Server Razor infrastrukturou Pages
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC nebo Blazor Server projekty s existující infrastrukturou MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, jinak se soubor rozložení přepíše nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor Stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Některé Identity Možnosti jsou nakonfigurovány v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Generování uživatelského rozhraní Identity do projektu MVC bez existující autorizace

Spustit Identity generování uživatelského rozhraní:

  • Z Průzkumník řešení klikněte pravým tlačítkem myši na projekt > Přidat > novou vygenerované položky.
  • V levém podokně dialogového okna Přidat novou vygenerované položky vyberte Identity > Přidat.
  • V dialogovém okně Identity Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, nebo bude soubor rozložení přepsán pomocí nesprávného kódu:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
      • Blazor Server aplikace vytvořené z Blazor Server šablony ( blazorserver ) nejsou Razor ve výchozím nastavení nakonfigurovány pro stránky nebo MVC. Ponechte položku stránky rozložení prázdnou.
    • Vyberte + tlačítko pro vytvoření nové třídy datového kontextu. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
  • Vyberte Přidat.

Volitelné: přidejte částečné přihlášení ( _LoginPartial ) do souboru views/Shared/_Layout. cshtml :

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcNoAuth3</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcNoAuth3</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - MvcNoAuth3</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Přesuňte soubor Pages/Shared/_LoginPartial. cshtml do views/shared/_LoginPartial. cshtml

Identityje nakonfigurovaný v oblasti/ Identity / Identity HostingStartup. cs. Další informace najdete v tématu IHostingStartup.

Vygenerovaný Identity kód databáze vyžaduje migraci Entity Framework Core. Vytvořte migraci a aktualizujte databázi. Například spusťte následující příkazy:

V konzole správce balíčků sady Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityParametr názvu "vytvořit schéma" pro Add-Migration příkaz je libovolný. "CreateIdentitySchema" Popisuje migraci.

Zavolat UseAuthentication po UseStaticFiles :

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute();
    }
}

UseHsts se doporučuje, ale nevyžaduje se. Další informace najdete v tématu Http Strict Transport Security Protocol.

Generování uživatelského rozhraní Identity do projektu MVC s autorizací

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, aby se soubor rozložení přepsal nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor stránky nebo projekty s existující Blazor Server Razor infrastrukturou Pages
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC nebo Blazor Server projekty s existující infrastrukturou MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Spusťte Identity nástroj pro generování uživatelského rozhraní:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a > nová > vysíněná položka.
  • V levém podokně dialogového okna Přidat generování uživatelského rozhraní vyberte Identity > Přidat.
  • V dialogovém Identity okně Přidat vyberte požadované možnosti.
    • Vyberte existující stránku rozložení, jinak se soubor rozložení přepíše nesprávným kódem. Pokud vyberete _ existující soubor Layout.cshtml, nebude přepsán. Například:
      • ~/Pages/Shared/_Layout.cshtml pro Razor Stránky
      • ~/Views/Shared/_Layout.cshtml pro projekty MVC
  • Pokud chcete použít existující kontext dat, vyberte alespoň jeden soubor, který chcete přepsat. Pokud chcete přidat kontext dat, musíte vybrat alespoň jeden soubor.
    • Vyberte třídu kontextu dat.
    • Vyberte Přidat.
  • Vytvoření nového kontextu uživatele a případně vytvoření vlastní třídy uživatele pro Identity :
    • Výběrem + tlačítka vytvořte novou třídu kontextu dat. Přijměte výchozí hodnotu nebo zadejte třídu (například MyApplication.Data.ApplicationDbContext ).
    • Vyberte Přidat.

Poznámka: Pokud vytváříte nový kontext uživatele, nemusíte vybrat soubor, který chcete přepsat.

Odstraňte stránky nebo sdílenou složku a soubory v této složce.

Vytvořit úplný Identity zdroj uživatelského rozhraní

Chcete-li zachovat úplnou kontrolu nad Identity uživatelským rozhraním, spusťte modul pro Identity generování uživatelského rozhraní a vyberte možnost přepsat všechny soubory.

následující zvýrazněný kód ukazuje změny, které nahradí výchozí Identity uživatelské rozhraní Identity ve webové aplikaci ASP.NET Core 2,1. To může být vhodné, pokud chcete mít úplnou kontrolu nad Identity uživatelským rozhraním.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

Výchozí hodnota Identity je nahrazena následujícím kódem:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Následující kód nastaví LoginPath, LogoutPatha AccessDeniedPath:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Zaregistrujte IEmailSender implementaci, například:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

Konfigurace hesla

Pokud PasswordOptions jsou nakonfigurovány v Startup.ConfigureServices , může být pro [StringLength] Password vlastnost v generovaných stránkách vyžadována konfigurace atributu Identity . InputModel``Passwordvlastnosti se nacházejí v následujících souborech:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Zakázat stránku registrace

Zakázání registrace uživatele:

  • Generování uživatelského rozhraní Identity . Přidejte účet. registr, Account. Login a account. RegisterConfirmation. Například:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aktualizovat oblasti/ Identity /Pages/Account/Register.cshtml.cs , aby se uživatelé nemohli registrovat z tohoto koncového bodu:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualizovat oblasti/ Identity /Pages/Account/Register.cshtml tak, aby byly v souladu s předchozími změnami:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Odkomentujte nebo odeberte odkaz na registraci z oblastí/ Identity /Pages/Account/Login.cshtml

@*
<p>
    <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
</p>
*@
  • Aktualizujte stránku oblasti/ Identity /Pages/Account/RegisterConfirmation .

    • Odeberte kód a odkazy ze souboru CSHTML.
    • Odstraňte potvrzovací kód z PageModel :
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Přidání uživatelů pomocí jiné aplikace

Poskytněte mechanismus pro přidání uživatelů mimo webovou aplikaci. Mezi možnosti přidávání uživatelů patří:

  • Vyhrazená webová aplikace pro správu.
  • Konzolová aplikace.

Následující kód popisuje jeden přístup k přidávání uživatelů:

  • Seznam uživatelů je čten do paměti.
  • Pro každého uživatele je vygenerováno silné jedinečné heslo.
  • Uživatel se přidá do Identity databáze.
  • Uživatel obdrží oznámení a sdělí mu změnu hesla.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Následující osnovy kódu přidávají uživatele:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Podobný přístup je možné vyřídit v produkčních scénářích.

Další zdroje informací