Migrieren der Authentifizierung und Identity zu ASP.net Core 2,0Migrate authentication and Identity to ASP.NET Core 2.0

Von Scott Adder und Hao KungBy Scott Addie and Hao Kung

ASP.net Core 2,0 verfügt über ein neues Modell für die Authentifizierung und Identity vereinfacht die Konfiguration mithilfe von Diensten.ASP.NET Core 2.0 has a new model for authentication and Identity that simplifies configuration by using services. ASP.net Core 1. x-Anwendungen, die die-Authentifizierung verwenden, oder Identity können aktualisiert werden, um das neue Modell wie unten beschrieben zu verwenden.ASP.NET Core 1.x applications that use authentication or Identity can be updated to use the new model as outlined below.

Namespaces aktualisierenUpdate namespaces

In 1. x wurden Klassen wie IdentityRole und IdentityUser im- Microsoft.AspNetCore.Identity.EntityFrameworkCore Namespace gefunden.In 1.x, classes such IdentityRole and IdentityUser were found in the Microsoft.AspNetCore.Identity.EntityFrameworkCore namespace.

In 2,0 wurde der Microsoft.AspNetCore.Identity Namespace zur neuen Startseite für einige dieser Klassen.In 2.0, the Microsoft.AspNetCore.Identity namespace became the new home for several of such classes. Mit dem Standard Identity Code enthalten die betroffenen Klassen ApplicationUser und Startup .With the default Identity code, affected classes include ApplicationUser and Startup. Passen Sie using die Anweisungen so an, dass die betroffenen Verweise aufgelöst werden.Adjust your using statements to resolve the affected references.

Authentifizierungs Middleware und-DiensteAuthentication Middleware and services

In 1. x-Projekten wird die Authentifizierung über Middleware konfiguriert.In 1.x projects, authentication is configured via middleware. Für jedes Authentifizierungsschema, das Sie unterstützen möchten, wird eine Middleware-Methode aufgerufen.A middleware method is invoked for each authentication scheme you want to support.

Im folgenden 1. x-Beispiel wird die Facebook-Authentifizierung mit Identity in Startup.cskonfiguriert:The following 1.x example configures Facebook authentication with Identity in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
}

public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory)
{
    app.UseIdentity();
    app.UseFacebookAuthentication(new FacebookOptions {
        AppId = Configuration["auth:facebook:appid"],
        AppSecret = Configuration["auth:facebook:appsecret"]
    });
}

In 2,0-Projekten wird die Authentifizierung über Dienste konfiguriert.In 2.0 projects, authentication is configured via services. Jedes Authentifizierungsschema ist in der- ConfigureServices Methode von Startup.csregistriert.Each authentication scheme is registered in the ConfigureServices method of Startup.cs. Die- UseIdentity Methode wird durch ersetzt UseAuthentication .The UseIdentity method is replaced with UseAuthentication.

Im 2,0 folgenden Beispiel wird die Facebook-Authentifizierung mit Identity in Startup.cskonfiguriert:The following 2.0 example configures Facebook authentication with Identity in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

    // If you want to tweak Identity cookies, they're no longer part of IdentityOptions.
    services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn");
    services.AddAuthentication()
            .AddFacebook(options =>
            {
                options.AppId = Configuration["auth:facebook:appid"];
                options.AppSecret = Configuration["auth:facebook:appsecret"];
            });
}

public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory) {
    app.UseAuthentication();
}

Die- UseAuthentication Methode fügt eine einzelne Authentifizierungs Middleware-Komponente hinzu, die für die automatische Authentifizierung und die Behandlung von Remote Authentifizierungsanforderungen zuständig ist.The UseAuthentication method adds a single authentication middleware component, which is responsible for automatic authentication and the handling of remote authentication requests. Es ersetzt alle einzelnen middlewarekomponenten durch eine einzelne, gängige Middlewarekomponente.It replaces all of the individual middleware components with a single, common middleware component.

Im folgenden finden Sie 2,0 Migrations Anweisungen für jedes wichtige Authentifizierungsschema.Below are 2.0 migration instructions for each major authentication scheme.

Cookie-basierte AuthentifizierungCookie-based authentication

Wählen Sie eine der beiden folgenden Optionen aus, und nehmen Sie die erforderlichen Änderungen in Startup.csvor:Select one of the two options below, and make the necessary changes in Startup.cs:

  1. Verwenden cookie von s mitIdentityUse cookies with Identity

    • Ersetzen Sie UseIdentity durch UseAuthentication in der- Configure Methode:Replace UseIdentity with UseAuthentication in the Configure method:

      app.UseAuthentication();
      
    • Rufen Sie die- AddIdentity Methode in der- ConfigureServices Methode auf, um die cookie Authentifizierungsdienste hinzuzufügen.Invoke the AddIdentity method in the ConfigureServices method to add the cookie authentication services.

    • Rufen Sie optional die- ConfigureApplicationCookie Methode oder die- ConfigureExternalCookie Methode in der- ConfigureServices Methode auf, um die Einstellungen zu optimieren Identity cookie .Optionally, invoke the ConfigureApplicationCookie or ConfigureExternalCookie method in the ConfigureServices method to tweak the Identity cookie settings.

      services.AddIdentity<ApplicationUser, IdentityRole>()
              .AddEntityFrameworkStores<ApplicationDbContext>()
              .AddDefaultTokenProviders();
      
      services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn");
      
  2. cookieS ohne verwendenIdentityUse cookies without Identity

    • Ersetzen Sie den UseCookieAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseCookieAuthentication method call in the Configure method with UseAuthentication:

      app.UseAuthentication();
      
    • Rufen Sie AddAuthentication die AddCookie Methoden und in der- ConfigureServices Methode auf:Invoke the AddAuthentication and AddCookie methods in the ConfigureServices method:

      // If you don't want the cookie to be automatically authenticated and assigned to HttpContext.User,
      // remove the CookieAuthenticationDefaults.AuthenticationScheme parameter passed to AddAuthentication.
      services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
              .AddCookie(options =>
              {
                  options.LoginPath = "/Account/LogIn";
                  options.LogoutPath = "/Account/LogOff";
              });
      

JWT-Träger AuthentifizierungJWT Bearer Authentication

Nehmen Sie die folgenden Änderungen in Startup.csvor:Make the following changes in Startup.cs:

  • Ersetzen Sie den UseJwtBearerAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseJwtBearerAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • Rufen Sie die- AddJwtBearer Methode in der- ConfigureServices Methode auf:Invoke the AddJwtBearer method in the ConfigureServices method:

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Audience = "http://localhost:5001/";
                options.Authority = "http://localhost:5000/";
            });
    

    Dieser Code Ausschnitt verwendet nicht Identity . Daher sollte das Standardschema durch Übergabe an die-Methode festgelegt werden JwtBearerDefaults.AuthenticationScheme AddAuthentication .This code snippet doesn't use Identity, so the default scheme should be set by passing JwtBearerDefaults.AuthenticationScheme to the AddAuthentication method.

OpenID Connect-Authentifizierung (oidc)OpenID Connect (OIDC) authentication

Nehmen Sie die folgenden Änderungen in Startup.csvor:Make the following changes in Startup.cs:

  • Ersetzen Sie den UseOpenIdConnectAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseOpenIdConnectAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • Rufen Sie die- AddOpenIdConnect Methode in der- ConfigureServices Methode auf:Invoke the AddOpenIdConnect method in the ConfigureServices method:

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect(options =>
    {
        options.Authority = Configuration["auth:oidc:authority"];
        options.ClientId = Configuration["auth:oidc:clientid"];
    });
    
  • Ersetzen Sie die- PostLogoutRedirectUri Eigenschaft in der OpenIdConnectOptions Aktion durch SignedOutRedirectUri :Replace the PostLogoutRedirectUri property in the OpenIdConnectOptions action with SignedOutRedirectUri:

    .AddOpenIdConnect(options =>
    {
        options.SignedOutRedirectUri = "https://contoso.com";
    });
    

Facebook-AuthentifizierungFacebook authentication

Nehmen Sie die folgenden Änderungen in Startup.csvor:Make the following changes in Startup.cs:

  • Ersetzen Sie den UseFacebookAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseFacebookAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • Rufen Sie die- AddFacebook Methode in der- ConfigureServices Methode auf:Invoke the AddFacebook method in the ConfigureServices method:

    services.AddAuthentication()
            .AddFacebook(options =>
            {
                options.AppId = Configuration["auth:facebook:appid"];
                options.AppSecret = Configuration["auth:facebook:appsecret"];
            });
    

Google-AuthentifizierungGoogle authentication

Nehmen Sie die folgenden Änderungen in Startup.csvor:Make the following changes in Startup.cs:

  • Ersetzen Sie den UseGoogleAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseGoogleAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • Rufen Sie die- AddGoogle Methode in der- ConfigureServices Methode auf:Invoke the AddGoogle method in the ConfigureServices method:

    services.AddAuthentication()
            .AddGoogle(options =>
            {
                options.ClientId = Configuration["auth:google:clientid"];
                options.ClientSecret = Configuration["auth:google:clientsecret"];
            });
    

Authentifizierung über Microsoft-KontoMicrosoft Account authentication

Weitere Informationen zur Microsoft-Konto-Authentifizierung finden Sie in diesem GitHub-Problem.For more information on Microsoft account authentication, see this GitHub issue.

Nehmen Sie die folgenden Änderungen in Startup.csvor:Make the following changes in Startup.cs:

  • Ersetzen Sie den UseMicrosoftAccountAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseMicrosoftAccountAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • Rufen Sie die- AddMicrosoftAccount Methode in der- ConfigureServices Methode auf:Invoke the AddMicrosoftAccount method in the ConfigureServices method:

    services.AddAuthentication()
            .AddMicrosoftAccount(options =>
            {
                options.ClientId = Configuration["auth:microsoft:clientid"];
                options.ClientSecret = Configuration["auth:microsoft:clientsecret"];
            });
    

Twitter-AuthentifizierungTwitter authentication

Nehmen Sie die folgenden Änderungen in Startup.csvor:Make the following changes in Startup.cs:

  • Ersetzen Sie den UseTwitterAuthentication Methodenaufrufe in der- Configure Methode durch UseAuthentication :Replace the UseTwitterAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • Rufen Sie die- AddTwitter Methode in der- ConfigureServices Methode auf:Invoke the AddTwitter method in the ConfigureServices method:

    services.AddAuthentication()
            .AddTwitter(options =>
            {
                options.ConsumerKey = Configuration["auth:twitter:consumerkey"];
                options.ConsumerSecret = Configuration["auth:twitter:consumersecret"];
            });
    

Festlegen von Standard Authentifizierungs SchemasSetting default authentication schemes

In 1. x wollten die AutomaticAuthenticate -Eigenschaft und die-Eigenschaft AutomaticChallenge der authenticationoptions -Basisklasse für ein einzelnes Authentifizierungsschema festgelegt werden.In 1.x, the AutomaticAuthenticate and AutomaticChallenge properties of the AuthenticationOptions base class were intended to be set on a single authentication scheme. Es gab keinen guten Weg, dies zu erzwingen.There was no good way to enforce this.

In 2,0 wurden diese beiden Eigenschaften als Eigenschaften für die jeweilige AuthenticationOptions Instanz entfernt.In 2.0, these two properties have been removed as properties on the individual AuthenticationOptions instance. Sie können im AddAuthentication Methoden Befehl innerhalb der- ConfigureServices Methode von Startup.cskonfiguriert werden:They can be configured in the AddAuthentication method call within the ConfigureServices method of Startup.cs:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);

Im vorangehenden Code Ausschnitt ist das Standardschema auf CookieAuthenticationDefaults.AuthenticationScheme (" Cookie s") festgelegt.In the preceding code snippet, the default scheme is set to CookieAuthenticationDefaults.AuthenticationScheme ("Cookies").

Verwenden Sie alternativ eine überladene Version der- AddAuthentication Methode, um mehr als eine Eigenschaft festzulegen.Alternatively, use an overloaded version of the AddAuthentication method to set more than one property. Im folgenden Beispiel für eine überladene Methode wird das Standardschema auf festgelegt CookieAuthenticationDefaults.AuthenticationScheme .In the following overloaded method example, the default scheme is set to CookieAuthenticationDefaults.AuthenticationScheme. Das Authentifizierungsschema kann alternativ in ihren einzelnen [Authorize] Attributen oder Autorisierungs Richtlinien angegeben werden.The authentication scheme may alternatively be specified within your individual [Authorize] attributes or authorization policies.

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});

Definieren Sie ein Standardschema in 2,0, wenn eine der folgenden Bedingungen zutrifft:Define a default scheme in 2.0 if one of the following conditions is true:

  • Sie möchten, dass der Benutzer automatisch angemeldet wird.You want the user to be automatically signed in
  • Sie verwenden die [Authorize] Attribute oder Autorisierungs Richtlinien ohne Angabe von Schemas.You use the [Authorize] attribute or authorization policies without specifying schemes

Eine Ausnahme von dieser Regel ist die- AddIdentity Methode.An exception to this rule is the AddIdentity method. Mit dieser Methode werden cookie für Sie hinzugefügt, und die standardmäßigen authentifizierten und Challenge-Schemas werden für die Anwendung festgelegt cookie IdentityConstants.ApplicationScheme .This method adds cookies for you and sets the default authenticate and challenge schemes to the application cookie IdentityConstants.ApplicationScheme. Außerdem wird das Standard Anmelde Schema auf das externe festgelegt cookie IdentityConstants.ExternalScheme .Additionally, it sets the default sign-in scheme to the external cookie IdentityConstants.ExternalScheme.

Verwenden von HttpContext-Authentifizierungs ErweiterungenUse HttpContext authentication extensions

Die- IAuthenticationManager Schnittstelle ist der Haupteinstiegspunkt in das 1. x-Authentifizierungssystem.The IAuthenticationManager interface is the main entry point into the 1.x authentication system. Sie wurde durch einen neuen Satz von HttpContext Erweiterungs Methoden im- Microsoft.AspNetCore.Authentication Namespace ersetzt.It has been replaced with a new set of HttpContext extension methods in the Microsoft.AspNetCore.Authentication namespace.

Beispielsweise verweisen 1. x-Projekte auf eine Authentication Eigenschaft:For example, 1.x projects reference an Authentication property:

// Clear the existing external cookie to ensure a clean login process
await HttpContext.Authentication.SignOutAsync(_externalCookieScheme);

Importieren Sie in 2,0-Projekten den Microsoft.AspNetCore.Authentication -Namespace, und löschen Sie die Authentication Eigenschafts Verweise:In 2.0 projects, import the Microsoft.AspNetCore.Authentication namespace, and delete the Authentication property references:

// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

Windows-Authentifizierung (HTTP.sys/IISIntegration)Windows Authentication (HTTP.sys / IISIntegration)

Es gibt zwei Variationen der Windows-Authentifizierung:There are two variations of Windows authentication:

  • Der Host erlaubt nur authentifizierte Benutzer.The host only allows authenticated users. Diese Variation wirkt sich nicht auf die 2,0-Änderungen aus.This variation isn't affected by the 2.0 changes.

  • Der Host ermöglicht sowohl anonyme als auch authentifizierte Benutzer.The host allows both anonymous and authenticated users. Diese Variation ist von den 2,0-Änderungen betroffen.This variation is affected by the 2.0 changes. Beispielsweise sollte die APP anonyme Benutzer auf der IIS -oder HTTP.sys Schicht zulassen, aber Benutzer auf Controller Ebene autorisieren.For example, the app should allow anonymous users at the IIS or HTTP.sys layer but authorize users at the controller level. Legen Sie in diesem Szenario das Standardschema in der- Startup.ConfigureServices Methode fest.In this scenario, set the default scheme in the Startup.ConfigureServices method.

    Legen Sie für Microsoft. aspnetcore. Server. IISIntegrationdas Standardschema auf Folgendes fest IISDefaults.AuthenticationScheme :For Microsoft.AspNetCore.Server.IISIntegration, set the default scheme to IISDefaults.AuthenticationScheme:

    using Microsoft.AspNetCore.Server.IISIntegration;
    
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    

    Legen Sie für Microsoft. aspnetcore. Server. httpsysdas Standardschema auf Folgendes fest HttpSysDefaults.AuthenticationScheme :For Microsoft.AspNetCore.Server.HttpSys, set the default scheme to HttpSysDefaults.AuthenticationScheme:

    using Microsoft.AspNetCore.Server.HttpSys;
    
    services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
    

    Wenn Sie das Standardschema nicht festlegen, wird verhindert, dass die Autorisierungs Anforderung (Challenge) mit der folgenden Ausnahme funktioniert:Failure to set the default scheme prevents the authorize (challenge) request from working with the following exception:

    System.InvalidOperationException: Es wurde kein "authenticationScheme" angegeben, und es wurde kein defaultherausfordergescheme gefunden.System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found.

Weitere Informationen finden Sie unter Konfigurieren der Windows-Authentifizierung in ASP.net Core.For more information, see Konfigurieren der Windows-Authentifizierung in ASP.net Core.

IdentityCookieOptions InstanzenIdentityCookieOptions instances

Ein Nebeneffekt der 2,0-Änderungen ist der Wechsel zur Verwendung von benannten Optionen anstelle von cookie options Instanzen.A side effect of the 2.0 changes is the switch to using named options instead of cookie options instances. Die Möglichkeit zum Anpassen der Identity cookie Schema Namen wird entfernt.The ability to customize the Identity cookie scheme names is removed.

Beispielsweise verwenden 1. x-Projekte die Konstruktorinjektion , um einen IdentityCookieOptions Parameter an AccountController.cs und ManageController.cszu übergeben.For example, 1.x projects use constructor injection to pass an IdentityCookieOptions parameter into AccountController.cs and ManageController.cs. Der Zugriff auf das externe cookie Authentifizierungsschema erfolgt über die bereitgestellte-Instanz:The external cookie authentication scheme is accessed from the provided instance:

public AccountController(
    UserManager<ApplicationUser> userManager,
    SignInManager<ApplicationUser> signInManager,
    IOptions<IdentityCookieOptions> identityCookieOptions,
    IEmailSender emailSender,
    ISmsSender smsSender,
    ILoggerFactory loggerFactory)
{
    _userManager = userManager;
    _signInManager = signInManager;
    _externalCookieScheme = identityCookieOptions.Value.ExternalCookieAuthenticationScheme;
    _emailSender = emailSender;
    _smsSender = smsSender;
    _logger = loggerFactory.CreateLogger<AccountController>();
}

Die oben genannte Konstruktorinjektion ist in 2,0-Projekten unnötig, und das _externalCookieScheme Feld kann gelöscht werden:The aforementioned constructor injection becomes unnecessary in 2.0 projects, and the _externalCookieScheme field can be deleted:

public AccountController(
    UserManager<ApplicationUser> userManager,
    SignInManager<ApplicationUser> signInManager,
    IEmailSender emailSender,
    ISmsSender smsSender,
    ILoggerFactory loggerFactory)
{
    _userManager = userManager;
    _signInManager = signInManager;
    _emailSender = emailSender;
    _smsSender = smsSender;
    _logger = loggerFactory.CreateLogger<AccountController>();
}

1. x-Projekte haben das _externalCookieScheme Feld wie folgt verwendet:1.x projects used the _externalCookieScheme field as follows:

// Clear the existing external cookie to ensure a clean login process
await HttpContext.Authentication.SignOutAsync(_externalCookieScheme);

Ersetzen Sie in 2,0-Projekten den vorangehenden Code durch den folgenden Code.In 2.0 projects, replace the preceding code with the following. Die IdentityConstants.ExternalScheme Konstante kann direkt verwendet werden.The IdentityConstants.ExternalScheme constant can be used directly.

// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

Beheben Sie den neu hinzugefügten-Befehl, SignOutAsync indem Sie den folgenden Namespace importieren:Resolve the newly added SignOutAsync call by importing the following namespace:

using Microsoft.AspNetCore.Authentication;

IdentityBenutzer poco-Navigations Eigenschaften hinzufügenAdd IdentityUser POCO navigation properties

Die Entity Framework (EF)-Kern Navigations Eigenschaften des poco-Basis IdentityUser Objekts (Plain Old CLR Object) wurden entfernt.The Entity Framework (EF) Core navigation properties of the base IdentityUser POCO (Plain Old CLR Object) have been removed. Wenn Ihr 1. x-Projekt diese Eigenschaften verwendet hat, fügen Sie Sie dem Projekt 2,0 manuell wieder hinzu:If your 1.x project used these properties, manually add them back to the 2.0 project:

/// <summary>
/// Navigation property for the roles this user belongs to.
/// </summary>
public virtual ICollection<IdentityUserRole<int>> Roles { get; } = new List<IdentityUserRole<int>>();

/// <summary>
/// Navigation property for the claims this user possesses.
/// </summary>
public virtual ICollection<IdentityUserClaim<int>> Claims { get; } = new List<IdentityUserClaim<int>>();

/// <summary>
/// Navigation property for this users login accounts.
/// </summary>
public virtual ICollection<IdentityUserLogin<int>> Logins { get; } = new List<IdentityUserLogin<int>>();

Um beim Ausführen EF Core Migrationen doppelte Fremdschlüssel zu verhindern, fügen Sie der- IdentityDbContext OnModelCreating Methode (nach dem-Befehl) Folgendes hinzu base.OnModelCreating(); :To prevent duplicate foreign keys when running EF Core Migrations, add the following to your IdentityDbContext class' OnModelCreating method (after the base.OnModelCreating(); call):

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    // Customize the ASP.NET Core Identity model and override the defaults if needed.
    // For example, you can rename the ASP.NET Core Identity table names and more.
    // Add your customizations after calling base.OnModelCreating(builder);

    builder.Entity<ApplicationUser>()
        .HasMany(e => e.Claims)
        .WithOne()
        .HasForeignKey(e => e.UserId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);

    builder.Entity<ApplicationUser>()
        .HasMany(e => e.Logins)
        .WithOne()
        .HasForeignKey(e => e.UserId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);

    builder.Entity<ApplicationUser>()
        .HasMany(e => e.Roles)
        .WithOne()
        .HasForeignKey(e => e.UserId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);
}

Ersetzen von getexternalauthenticationschemasReplace GetExternalAuthenticationSchemes

Die synchrone Methode GetExternalAuthenticationSchemes wurde entfernt, um eine asynchrone Version zu bevorzugen.The synchronous method GetExternalAuthenticationSchemes was removed in favor of an asynchronous version. 1. x-Projekte verfügen über den folgenden Code in Controllers/managecontroller. cs:1.x projects have the following code in Controllers/ManageController.cs:

var otherLogins = _signInManager.GetExternalAuthenticationSchemes().Where(auth => userLogins.All(ul => auth.AuthenticationScheme != ul.LoginProvider)).ToList();

Diese Methode wird auch in views/Account/Login. cshtml angezeigt:This method appears in Views/Account/Login.cshtml too:

@{
    var loginProviders = SignInManager.GetExternalAuthenticationSchemes().ToList();
    if (loginProviders.Count == 0)
    {
        <div>
            <p>
                There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a>
                for details on setting up this ASP.NET application to support logging in via external services.
            </p>
        </div>
    }
    else
    {
        <form asp-controller="Account" asp-action="ExternalLogin" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">
            <div>
                <p>
                    @foreach (var provider in loginProviders)
                    {
                        <button type="submit" class="btn btn-default" name="provider" value="@provider.AuthenticationScheme" title="Log in using your @provider.DisplayName account">@provider.AuthenticationScheme</button>
                    }
                </p>
            </div>
        </form>
    }
}

Verwenden Sie in 2,0-Projekten die- GetExternalAuthenticationSchemesAsync Methode.In 2.0 projects, use the GetExternalAuthenticationSchemesAsync method. Die Änderung in ManageController.cs ähnelt dem folgenden Code:The change in ManageController.cs resembles the following code:

var schemes = await _signInManager.GetExternalAuthenticationSchemesAsync();
var otherLogins = schemes.Where(auth => userLogins.All(ul => auth.Name != ul.LoginProvider)).ToList();

In Login. cshtmlwird die AuthenticationScheme Eigenschaft, auf die in der Schleife zugegriffen wird, in foreach geändert Name :In Login.cshtml, the AuthenticationScheme property accessed in the foreach loop changes to Name:

@{
    var loginProviders = (await SignInManager.GetExternalAuthenticationSchemesAsync()).ToList();
    if (loginProviders.Count == 0)
    {
        <div>
            <p>
                There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a>
                for details on setting up this ASP.NET application to support logging in via external services.
            </p>
        </div>
    }
    else
    {
        <form asp-controller="Account" asp-action="ExternalLogin" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">
            <div>
                <p>
                    @foreach (var provider in loginProviders)
                    {
                        <button type="submit" class="btn btn-default" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button>
                    }
                </p>
            </div>
        </form>
    }
}

Änderung der manageloginsviewmodel-EigenschaftManageLoginsViewModel property change

Ein- ManageLoginsViewModel Objekt wird in der ManageLogins ManageController.cs-Aktion verwendet.A ManageLoginsViewModel object is used in the ManageLogins action of ManageController.cs. In 1. x-Projekten OtherLogins lautet der Rückgabetyp des-Objekts IList<AuthenticationDescription> .In 1.x projects, the object's OtherLogins property return type is IList<AuthenticationDescription>. Dieser Rückgabetyp erfordert den Import von Microsoft.AspNetCore.Http.Authentication :This return type requires an import of Microsoft.AspNetCore.Http.Authentication:

using System.Collections.Generic;
using Microsoft.AspNetCore.Http.Authentication;
using Microsoft.AspNetCore.Identity;

namespace AspNetCoreDotNetCore1App.Models.ManageViewModels
{
    public class ManageLoginsViewModel
    {
        public IList<UserLoginInfo> CurrentLogins { get; set; }

        public IList<AuthenticationDescription> OtherLogins { get; set; }
    }
}

In 2,0-Projekten wird der Rückgabetyp in geändert IList<AuthenticationScheme> .In 2.0 projects, the return type changes to IList<AuthenticationScheme>. Dieser neue Rückgabetyp erfordert, dass der Microsoft.AspNetCore.Http.Authentication Import durch einen Import ersetzt wird Microsoft.AspNetCore.Authentication .This new return type requires replacing the Microsoft.AspNetCore.Http.Authentication import with a Microsoft.AspNetCore.Authentication import.

using System.Collections.Generic;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;

namespace AspNetCoreDotNetCore2App.Models.ManageViewModels
{
    public class ManageLoginsViewModel
    {
        public IList<UserLoginInfo> CurrentLogins { get; set; }

        public IList<AuthenticationScheme> OtherLogins { get; set; }
    }
}

Weitere RessourcenAdditional resources

Weitere Informationen finden Sie in der Erörterung des Themas auth 2,0 auf GitHub.For more information, see the Discussion for Auth 2.0 issue on GitHub.