ASP.NET Core 2.0으로 인증 및 Id 마이그레이션Migrate authentication and Identity to ASP.NET Core 2.0

하 여 Scott AddieHao 둘러싼By Scott Addie and Hao Kung

ASP.NET Core 2.0에는 새 모델을 인증 하 고 Identity 서비스를 사용 하 여 구성을 간소화 하는 합니다.ASP.NET Core 2.0 has a new model for authentication and Identity that simplifies configuration by using services. 아래에 설명 된 대로 새 모델을 사용 하도록 인증 또는 Id를 사용 하는 ASP.NET Core 1.x 응용 프로그램을 업데이트할 수 있습니다.ASP.NET Core 1.x applications that use authentication or Identity can be updated to use the new model as outlined below.

네임 스페이스를 업데이트 합니다.Update namespaces

1.x, 클래스 등 IdentityRole 하 고 IdentityUser 에서 찾을 수 없습니다는 Microsoft.AspNetCore.Identity.EntityFrameworkCore 네임 스페이스입니다.In 1.x, classes such IdentityRole and IdentityUser were found in the Microsoft.AspNetCore.Identity.EntityFrameworkCore namespace.

2.0에 Microsoft.AspNetCore.Identity 네임 스페이스는 이러한 클래스의 새 홈 되었습니다.In 2.0, the Microsoft.AspNetCore.Identity namespace became the new home for several of such classes. 영향을 받는 클래스에 포함 되어 기본 Identity 코드로 ApplicationUserStartup입니다.With the default Identity code, affected classes include ApplicationUser and Startup. 조정에 using 영향을 받는 참조를 확인 하는 문입니다.Adjust your using statements to resolve the affected references.

인증 미들웨어 및 서비스Authentication Middleware and services

1.x 프로젝트에서 인증 미들웨어를 통해 구성 됩니다.In 1.x projects, authentication is configured via middleware. 지원 하려는 각 인증 체계에 대 한 미들웨어 메서드를 호출 합니다.A middleware method is invoked for each authentication scheme you want to support.

Id를 사용 하 여 Facebook 인증을 구성 하는 1.x 다음과 Startup.cs: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"]
    });
}

2.0 프로젝트에서 인증 서비스를 통해 구성 됩니다.In 2.0 projects, authentication is configured via services. 각 인증 체계에 등록 합니다 ConfigureServices 메서드의 Startup.cs합니다.Each authentication scheme is registered in the ConfigureServices method of Startup.cs. 합니다 UseIdentity 메서드를 사용 하 여 바뀝니다 UseAuthentication합니다.The UseIdentity method is replaced with UseAuthentication.

다음 예제에서는 2.0에서 Id를 사용 하 여 Facebook 인증 구성 Startup.cs: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();
}

UseAuthentication 메서드 자동 인증 및 원격 인증 요청의 처리를 담당 하는 단일 인증 미들웨어 구성 요소를 추가 합니다.The UseAuthentication method adds a single authentication middleware component, which is responsible for automatic authentication and the handling of remote authentication requests. 단일의 공통 미들웨어 구성 요소를 사용 하 여 각 미들웨어 구성 요소를 모두 대체합니다.It replaces all of the individual middleware components with a single, common middleware component.

다음은 각 주요 인증 체계에 대 한 마이그레이션 지침은 2.0입니다.Below are 2.0 migration instructions for each major authentication scheme.

아래 두 옵션 중 하나를 선택 하 고에서 필요한 사항을 변경한 Startup.cs:Select one of the two options below, and make the necessary changes in Startup.cs:

  1. Identity를 사용 하 여 쿠키를 사용 합니다.Use cookies with Identity

    • 바꿉니다 UseIdentity 사용 하 여 UseAuthenticationConfigure 메서드:Replace UseIdentity with UseAuthentication in the Configure method:

      app.UseAuthentication();
      
    • 호출 된 AddIdentity 의 메서드는 ConfigureServices 쿠키 인증 서비스를 추가 하는 방법.Invoke the AddIdentity method in the ConfigureServices method to add the cookie authentication services.

    • 필요에 따라 호출을 ConfigureApplicationCookie 또는 ConfigureExternalCookie 에서 메서드는 ConfigureServices Id 쿠키 설정을 조정 하는 방법입니다.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. Id 없이 쿠키 사용Use cookies without Identity

    • 대체는 UseCookieAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseCookieAuthentication method call in the Configure method with UseAuthentication:

      app.UseAuthentication();
      
    • 호출을 AddAuthentication 하 고 AddCookie 의 메서드는 ConfigureServices 메서드: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 전달자 인증JWT Bearer Authentication

다음과 같이 변경할 Startup.cs:Make the following changes in Startup.cs:

  • 대체는 UseJwtBearerAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseJwtBearerAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • 호출 된 AddJwtBearer 의 메서드는 ConfigureServices 메서드:Invoke the AddJwtBearer method in the ConfigureServices method:

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

    이 코드 조각은 기본 체계를 전달 하 여 설정 해야 하므로 Id를 사용 하지 않습니다 JwtBearerDefaults.AuthenticationSchemeAddAuthentication 메서드.This code snippet doesn't use Identity, so the default scheme should be set by passing JwtBearerDefaults.AuthenticationScheme to the AddAuthentication method.

OIDC (OpenID Connect) 인증OpenID Connect (OIDC) authentication

다음과 같이 변경할 Startup.cs:Make the following changes in Startup.cs:

  • 대체는 UseOpenIdConnectAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseOpenIdConnectAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • 호출 된 AddOpenIdConnect 의 메서드는 ConfigureServices 메서드: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"];
    });
    
  • 대체는 PostLogoutRedirectUri 의 속성을 OpenIdConnectOptions 작업과 SignedOutRedirectUri:Replace the PostLogoutRedirectUri property in the OpenIdConnectOptions action with SignedOutRedirectUri:

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

Facebook 인증Facebook authentication

다음과 같이 변경할 Startup.cs:Make the following changes in Startup.cs:

  • 대체는 UseFacebookAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseFacebookAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • 호출 된 AddFacebook 의 메서드는 ConfigureServices 메서드: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 인증Google authentication

다음과 같이 변경할 Startup.cs:Make the following changes in Startup.cs:

  • 대체는 UseGoogleAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseGoogleAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • 호출 된 AddGoogle 의 메서드는 ConfigureServices 메서드:Invoke the AddGoogle method in the ConfigureServices method:

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

Microsoft 계정 인증Microsoft Account authentication

다음과 같이 변경할 Startup.cs:Make the following changes in Startup.cs:

  • 대체는 UseMicrosoftAccountAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseMicrosoftAccountAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • 호출 된 AddMicrosoftAccount 의 메서드는 ConfigureServices 메서드: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 인증Twitter authentication

다음과 같이 변경할 Startup.cs:Make the following changes in Startup.cs:

  • 대체는 UseTwitterAuthentication 메서드 호출을 Configure 메서드를 UseAuthentication:Replace the UseTwitterAuthentication method call in the Configure method with UseAuthentication:

    app.UseAuthentication();
    
  • 호출 된 AddTwitter 의 메서드는 ConfigureServices 메서드:Invoke the AddTwitter method in the ConfigureServices method:

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

기본 인증 체계를 설정합니다.Setting default authentication schemes

1.x의 경우에 AutomaticAuthenticateAutomaticChallenge 의 속성을 AuthenticationOptions 기본 클래스에서 단일 인증 체계를 설정할 데 사용 된 합니다.In 1.x, the AutomaticAuthenticate and AutomaticChallenge properties of the AuthenticationOptions base class were intended to be set on a single authentication scheme. 이 적용할 좋은 방법이 없었습니다.There was no good way to enforce this.

2.0에서는 이러한 두 속성이 제거 되었습니다. 개별 속성으로 AuthenticationOptions 인스턴스.In 2.0, these two properties have been removed as properties on the individual AuthenticationOptions instance. 구성할 수 있습니다 합니다 AddAuthentication 메서드 호출을 ConfigureServices 메서드의 Startup.cs:They can be configured in the AddAuthentication method call within the ConfigureServices method of Startup.cs:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);

기본 스키마로 이전 코드 조각에서 CookieAuthenticationDefaults.AuthenticationScheme ("쿠키").In the preceding code snippet, the default scheme is set to CookieAuthenticationDefaults.AuthenticationScheme ("Cookies").

또는의 오버 로드 된 버전을 사용 합니다 AddAuthentication 둘 이상의 속성을 설정 하는 방법입니다.Alternatively, use an overloaded version of the AddAuthentication method to set more than one property. 기본 스키마로 다음 오버 로드 된 메서드 예제의 CookieAuthenticationDefaults.AuthenticationScheme합니다.In the following overloaded method example, the default scheme is set to CookieAuthenticationDefaults.AuthenticationScheme. 인증 체계 또는 개별 내에서 지정할 수 있습니다 [Authorize] 특성 또는 권한 부여 정책.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;
});

다음 조건 중 하나가 참인 경우 2.0 기본 체계를 정의 합니다.Define a default scheme in 2.0 if one of the following conditions is true:

  • 사용자가 자동으로 로그인You want the user to be automatically signed in
  • 사용 된 [Authorize] 구성표를 지정 하지 않고 특성 또는 권한 부여 정책You use the [Authorize] attribute or authorization policies without specifying schemes

이 규칙의 예외는 AddIdentity 메서드.An exception to this rule is the AddIdentity method. 이 메서드를 기본 인증 및 응용 프로그램 쿠키에 스키마를 요구 하는 집합에 대 한 쿠키를 추가 IdentityConstants.ApplicationScheme합니다.This method adds cookies for you and sets the default authenticate and challenge schemes to the application cookie IdentityConstants.ApplicationScheme. 기본 로그인 구성표 외부 쿠키에 설정 또한 IdentityConstants.ExternalScheme합니다.Additionally, it sets the default sign-in scheme to the external cookie IdentityConstants.ExternalScheme.

HttpContext 인증 확장 프로그램 사용Use HttpContext authentication extensions

IAuthenticationManager 인터페이스는 1.x 인증 시스템의 주 진입점입니다.The IAuthenticationManager interface is the main entry point into the 1.x authentication system. 새 집합을 사용 하 여 바뀌었습니다 HttpContext 의 확장 메서드는 Microsoft.AspNetCore.Authentication 네임 스페이스입니다.It has been replaced with a new set of HttpContext extension methods in the Microsoft.AspNetCore.Authentication namespace.

예를 들어 1.x 프로젝트 참조는 Authentication 속성: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);

2.0 프로젝트에서 가져오는 합니다 Microsoft.AspNetCore.Authentication 네임 스페이스 및 삭제는 Authentication 속성 참조: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 인증 (HTTP.sys / IISIntegration)Windows Authentication (HTTP.sys / IISIntegration)

Windows 인증의 두 가지 변형이 있습니다.There are two variations of Windows authentication:

  • 호스트는 인증 된 사용자만 허용합니다.The host only allows authenticated users. 이 변형 2.0 변경 내용의 영향을 받지 않습니다.This variation isn't affected by the 2.0 changes.

  • 호스트 허용 모두 익명 사용자를 인증 합니다.The host allows both anonymous and authenticated users. 이 변형 2.0 변경의 영향.This variation is affected by the 2.0 changes. 예를 들어 앱에서 익명 사용자를 허용 해야 합니다 IIS 또는 HTTP.sys 계층 하지만 컨트롤러 수준에서 사용자 권한을 부여 합니다.For example, the app should allow anonymous users at the IIS or HTTP.sys layer but authorize users at the controller level. 이 시나리오에서는 기본 스키마에 설정 된 Startup.ConfigureServices 메서드.In this scenario, set the default scheme in the Startup.ConfigureServices method.

    에 대 한 Microsoft.AspNetCore.Server.IISIntegration, 기본 스키마로 IISDefaults.AuthenticationScheme:For Microsoft.AspNetCore.Server.IISIntegration, set the default scheme to IISDefaults.AuthenticationScheme:

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

    에 대 한 Microsoft.AspNetCore.Server.HttpSys, 기본 스키마로 HttpSysDefaults.AuthenticationScheme:For Microsoft.AspNetCore.Server.HttpSys, set the default scheme to HttpSysDefaults.AuthenticationScheme:

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

    기본 스키마를 설정 하지 못했습니다 다음 예외로 인해 작업에서 권한 부여 (챌린지) 요청을 방지 합니다.Failure to set the default scheme prevents the authorize (challenge) request from working with the following exception:

    System.InvalidOperationException: 없습니다 authenticationScheme 지정 하 고 찾을 수 없는 DefaultChallengeScheme 했습니다.System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found.

자세한 내용은 ASP.NET Core에서 Windows 인증을 구성 합니다.을 참조하세요.For more information, see ASP.NET Core에서 Windows 인증을 구성 합니다..

IdentityCookieOptions 인스턴스IdentityCookieOptions instances

2.0 변경의 부작용으로 나타납니다 명명 된 쿠키 옵션 인스턴스 대신 옵션을 사용 하도록 전환 됩니다.A side effect of the 2.0 changes is the switch to using named options instead of cookie options instances. Identity 쿠키 구성표 이름을 사용자 지정 하는 기능 제거 됩니다.The ability to customize the Identity cookie scheme names is removed.

1.x 프로젝트를 사용 하 여 예를 들어 생성자 주입 전달 하는 IdentityCookieOptions 에 매개 변수 AccountController.cs 하 고 ManageController.cs.For example, 1.x projects use constructor injection to pass an IdentityCookieOptions parameter into AccountController.cs and ManageController.cs. 외부 쿠키 인증 체계는 제공 된 인스턴스에서 액세스 합니다.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>();
}

앞서 언급 한 생성자 주입 2.0 프로젝트에서 불필요 하 게 됩니다 및 _externalCookieScheme 필드를 삭제할 수 있습니다.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 프로젝트는 _externalCookieScheme 다음과 같이 필드: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);

2.0 프로젝트에서 앞의 코드를 다음으로 바꿉니다.In 2.0 projects, replace the preceding code with the following. IdentityConstants.ExternalScheme 상수를 직접 사용할 수 있습니다.The IdentityConstants.ExternalScheme constant can be used directly.

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

새로 추가 된 해결 SignOutAsync 다음 네임 스페이스를 가져와서 호출 합니다.Resolve the newly added SignOutAsync call by importing the following namespace:

using Microsoft.AspNetCore.Authentication;

POCO IdentityUser 탐색 속성 추가Add IdentityUser POCO navigation properties

자료의 Entity Framework (EF) Core 탐색 속성 IdentityUser POCO (Plain Old CLR Object) 제거 되었습니다.The Entity Framework (EF) Core navigation properties of the base IdentityUser POCO (Plain Old CLR Object) have been removed. 이러한 속성을 사용 하는 1.x 프로젝트 경우 수동으로 추가 2.0 프로젝트: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>>();

중복 된 외래 키를 EF Core 마이그레이션을 실행 하는 경우를 방지 하려면 다음을 추가 하 IdentityDbContext 클래스의 OnModelCreating 메서드 (후는 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);
}

GetExternalAuthenticationSchemes 대체Replace GetExternalAuthenticationSchemes

동기 메서드 GetExternalAuthenticationSchemes 비동기 버전을 위해 제거 되었습니다.The synchronous method GetExternalAuthenticationSchemes was removed in favor of an asynchronous version. 1.x 프로젝트 같은 코드를 가정해 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();

이 메서드가 나타납니다 Views/Account/Login.cshtml 너무: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>
    }
}

2.0 프로젝트에서 사용 된 GetExternalAuthenticationSchemesAsync 메서드.In 2.0 projects, use the GetExternalAuthenticationSchemesAsync method. 변경을 ManageController.cs 다음 코드와 유사 합니다.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();

Login.cshtmlAuthenticationScheme 액세스 되는 속성을 foreach 루프 변경 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>
    }
}

ManageLoginsViewModel 속성 변경ManageLoginsViewModel property change

A ManageLoginsViewModel 개체가 사용 되는 ManageLogins 의 동작 ManageController.cs합니다.A ManageLoginsViewModel object is used in the ManageLogins action of ManageController.cs. 1.x 프로젝트에서 개체의 OtherLogins 속성이 반환 형식이 IList<AuthenticationDescription>합니다.In 1.x projects, the object's OtherLogins property return type is IList<AuthenticationDescription>. 이 반환 형식은 가져오는 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; }
    }
}

2.0 프로젝트에서 반환 형식을 변경 IList<AuthenticationScheme>합니다.In 2.0 projects, the return type changes to IList<AuthenticationScheme>. 대체이 새 반환 형식이 필요 합니다 Microsoft.AspNetCore.Http.Authentication 사용 하 여 가져오기는 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; }
    }
}

추가 자료Additional resources

자세한 내용은 참조는 인증 2.0에 대 한 토론 GitHub에서 문제입니다.For more information, see the Discussion for Auth 2.0 issue on GitHub.