기존 프로젝트에 ASP.NET MVC5 ID 인증 추가


164

웹에서 비슷한 페이지를 많이 보았지만 대부분 기존 페이지 대신 새 프로젝트를 사용하거나 필요한 기능이 없습니다. 그래서 기존 MVC 5프로젝트가 있으며 ASP.NET MVC5 Identity를 로그인, 전자 메일 확인 및 암호 재설정 기능 통합하려고 합니다.

이 외에도 데이터베이스에 필요한 모든 테이블 ( 예 : 사용자, 역할, 그룹 등) 을 만들어야합니다 (프로젝트에서 EF 코드 우선 사용). 이러한 요구에 해당하는 기사 나 샘플이 있습니까? 어떤 제안이라도 감사하겠습니다. 미리 감사드립니다 ...


바로 아래에 주어진 훌륭한 질문과 간단한 용질. 나는 그것을 읽는 것을 좋아했으며 기존 프로젝트에도 통합해야했습니다.
Ishwor Khanal

답변:


282

기존 프로젝트에 ID를 구성하는 것은 어렵지 않습니다. NuGet 패키지를 설치하고 작은 구성을 수행해야합니다.

먼저 패키지 관리자 콘솔을 사용하여 다음 NuGet 패키지를 설치하십시오.

PM> Install-Package Microsoft.AspNet.Identity.Owin 
PM> Install-Package Microsoft.AspNet.Identity.EntityFramework
PM> Install-Package Microsoft.Owin.Host.SystemWeb 

IdentityUser상속 과 함께 사용자 클래스를 추가하십시오 .

public class AppUser : IdentityUser
{
    //add your custom properties which have not included in IdentityUser before
    public string MyExtraProperty { get; set; }  
}

역할에 대해 동일한 작업을 수행하십시오.

public class AppRole : IdentityRole
{
    public AppRole() : base() { }
    public AppRole(string name) : base(name) { }
    // extra properties here 
}

DbContext부모 DbContext를 다음 IdentityDbContext<AppUser>과 같이 변경하십시오 .

public class MyDbContext : IdentityDbContext<AppUser>
{
    // Other part of codes still same 
    // You don't need to add AppUser and AppRole 
    // since automatically added by inheriting form IdentityDbContext<AppUser>
}

동일한 연결 문자열을 사용하고 마이그레이션을 활성화하면 EF가 필요한 테이블을 생성합니다.

선택적으로 UserManager원하는 구성 및 사용자 정의를 추가 하도록 확장 할 수 있습니다.

public class AppUserManager : UserManager<AppUser>
{
    public AppUserManager(IUserStore<AppUser> store)
        : base(store)
    {
    }

    // this method is called by Owin therefore this is the best place to configure your User Manager
    public static AppUserManager Create(
        IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
    {
        var manager = new AppUserManager(
            new UserStore<AppUser>(context.Get<MyDbContext>()));

        // optionally configure your manager
        // ...

        return manager;
    }
}

Identity는 OWIN을 기반으로하기 때문에 OWIN도 구성해야합니다.

App_Start폴더 에 클래스를 추가하십시오 (또는 원하는 경우 다른 곳). 이 클래스는 OWIN에서 사용합니다. 이것은 당신의 시작 수업이 될 것입니다.

namespace MyAppNamespace
{
    public class IdentityConfig
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext(() => new MyDbContext());
            app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
            app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
                new RoleManager<AppRole>(
                    new RoleStore<AppRole>(context.Get<MyDbContext>())));

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Home/Login"),
            });
        }
    }
}

web.configOWIN이 시작 클래스를 찾을 수 있도록 이 코드 줄을 파일에 추가하면됩니다 .

<appSettings>
    <!-- other setting here -->
    <add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" />
</appSettings>

이제 전체 프로젝트에서 VS가 이미 설치 한 새 프로젝트와 동일하게 Identity를 사용할 수 있습니다. 예를 들어 로그인 조치를 고려하십시오.

[HttpPost]
public ActionResult Login(LoginViewModel login)
{
    if (ModelState.IsValid)
    {
        var userManager = HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
        var authManager = HttpContext.GetOwinContext().Authentication;

        AppUser user = userManager.Find(login.UserName, login.Password);
        if (user != null)
        {
            var ident = userManager.CreateIdentity(user, 
                DefaultAuthenticationTypes.ApplicationCookie);
            //use the instance that has been created. 
            authManager.SignIn(
                new AuthenticationProperties { IsPersistent = false }, ident);
            return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home"));
        }
    }
    ModelState.AddModelError("", "Invalid username or password");
    return View(login);
}

역할을 수행하고 사용자를 추가 할 수 있습니다.

public ActionResult CreateRole(string roleName)
{
    var roleManager=HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>();

    if (!roleManager.RoleExists(roleName))
        roleManager.Create(new AppRole(roleName));
    // rest of code
} 

다음과 같이 사용자에게 역할을 추가 할 수도 있습니다.

UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName");

사용 Authorize하면 작업 또는 컨트롤러를 보호 할 수 있습니다.

[Authorize]
public ActionResult MySecretAction() {}

또는

[Authorize(Roles = "Admin")]]
public ActionResult MySecretAction() {}

또한 추가 패키지를 설치 Microsoft.Owin.Security.Facebook하고 원하는 또는 원하는 요구 사항을 충족하도록 구성 할 수 있습니다 .

참고 : 파일에 관련 네임 스페이스를 추가하는 것을 잊지 마십시오.

using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;

당신은 또한 같은 내 다른 답변 볼 수있는 아이덴티티의 고급 사용.


2
두 솔루션 모두 비슷하게 보입니다. 내가 사용한 AppRole및 분류 사용자 신원의 역할 관리자. 그리고 이후 Role의과가 RoleManager이미 신원 자체적으로 구현 한 당신은 이미 구현 코드를 다시 작성할 필요가 없습니다. 역할을 사용하는 방법을 보여주기 위해 게시물을 업데이트하겠습니다. 앞서 말씀 드린 것처럼 ID를 초기화 하려면 add AppUserAppRole엔티티가 필요합니다 . 귀하의 상속에 의해 DbContext에서 IdentityDbContext<AppUser>필요한 모든 테이블에 테이블을 추가 할 수 있습니다. 마이그레이션을 활성화하기 위해 아무것도 할 필요가 없습니다.
Sam Farajpour Ghamari

2
방금 샘플 사용법을 추가했습니다. Microsoft.AspNet.Identity.EntityFramework도메인 및 기타 UI 용으로 설치 하십시오.
Sam Farajpour Ghamari 15:56에

2
1) 걱정하지 마십시오 web.config. 오래된 것을 교체하지 마십시오. 더 많은 정보를 원하시면 이것을 읽으십시오 . MVC도 업그레이드 된 것 같습니다.
Sam Farajpour Ghamari

1
2) 당신이 옳았습니다. 3) 문제 없습니다. 당신은 5 새 테이블해야합니다 AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRolesAspNetUsers
샘 Farajpour Ghamari

3
Clint Eastwood, Nice Job을 돕기 위해 남겨둔 모든 의견을 읽었습니다. 전 세계에 You plusOne과 같은 더 많은 사람들이 필요합니다
Chef_Code

24

이것이 Identity를 기존 데이터베이스와 통합하기 위해 수행 한 작업입니다.

  1. MVC 템플릿으로 샘플 MVC 프로젝트를 만듭니다. 여기에는 Identity 구현에 필요한 모든 코드 (Startup.Auth.cs, IdentityConfig.cs, 계정 컨트롤러 코드, 컨트롤러 관리, 모델 및 관련보기)가 있습니다.

  2. Identity 및 OWIN에 필요한 너겟 패키지를 설치하십시오. 샘플 프로젝트의 참조와 @Sam의 답변을 보면 아이디어를 얻을 수 있습니다.

  3. 이 코드를 모두 기존 프로젝트에 복사하십시오. Identity가 데이터베이스에 매핑되도록 "DefaultConnection"연결 문자열을 추가해야합니다. "DefaultConnection"연결 문자열에 대한 참조를 찾을 수있는 IdentityModel.cs에서 ApplicationDBContext 클래스를 확인하십시오.

  4. 이것은 필요한 테이블을 만들기 위해 기존 데이터베이스에서 실행 한 SQL 스크립트입니다.

    USE ["YourDatabse"]
    GO
    /****** Object:  Table [dbo].[AspNetRoles]    Script Date: 16-Aug-15 6:52:25 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[AspNetRoles](
    [Id] [nvarchar](128) NOT NULL,
    [Name] [nvarchar](256) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED 
    (
      [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[AspNetUserClaims]    Script Date: 16-Aug-15 6:52:25 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[AspNetUserClaims](
       [Id] [int] IDENTITY(1,1) NOT NULL,
       [UserId] [nvarchar](128) NOT NULL,
       [ClaimType] [nvarchar](max) NULL,
       [ClaimValue] [nvarchar](max) NULL,
    CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED 
    (
       [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[AspNetUserLogins]    Script Date: 16-Aug-15 6:52:25 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[AspNetUserLogins](
        [LoginProvider] [nvarchar](128) NOT NULL,
        [ProviderKey] [nvarchar](128) NOT NULL,
        [UserId] [nvarchar](128) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED 
    (
        [LoginProvider] ASC,
        [ProviderKey] ASC,
        [UserId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[AspNetUserRoles]    Script Date: 16-Aug-15 6:52:25 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[AspNetUserRoles](
       [UserId] [nvarchar](128) NOT NULL,
       [RoleId] [nvarchar](128) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED 
    (
        [UserId] ASC,
        [RoleId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[AspNetUsers]    Script Date: 16-Aug-15 6:52:25 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[AspNetUsers](
        [Id] [nvarchar](128) NOT NULL,
        [Email] [nvarchar](256) NULL,
        [EmailConfirmed] [bit] NOT NULL,
        [PasswordHash] [nvarchar](max) NULL,
        [SecurityStamp] [nvarchar](max) NULL,
        [PhoneNumber] [nvarchar](max) NULL,
        [PhoneNumberConfirmed] [bit] NOT NULL,
        [TwoFactorEnabled] [bit] NOT NULL,
        [LockoutEndDateUtc] [datetime] NULL,
        [LockoutEnabled] [bit] NOT NULL,
        [AccessFailedCount] [int] NOT NULL,
        [UserName] [nvarchar](256) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
     GO
     ALTER TABLE [dbo].[AspNetUserClaims]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
     REFERENCES [dbo].[AspNetUsers] ([Id])
     ON DELETE CASCADE
     GO
     ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]
     GO
     ALTER TABLE [dbo].[AspNetUserLogins]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
     REFERENCES [dbo].[AspNetUsers] ([Id])
     ON DELETE CASCADE
     GO
     ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]
     GO
     ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId])
     REFERENCES [dbo].[AspNetRoles] ([Id])
     ON DELETE CASCADE
     GO
     ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
     GO
     ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
     REFERENCES [dbo].[AspNetUsers] ([Id])
     ON DELETE CASCADE
     GO
     ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]
     GO
  5. 남은 오류를 확인하고 해결하면 완료됩니다. 정체성은 나머지를 처리합니다 :)


1
답장과 좋은 설명에 감사드립니다. 실제로 다른 접근법을 사용하려고 생각하지만 시도해 볼 것입니다. 투표 +

2
나는 이것이 훨씬 더 깔끔한 접근이라고 생각합니다
niico

3
Startup.Auth.cs 클래스 외에도 샘플 프로젝트의 루트에있는 Startup.cs를 복사해야합니다.
Padmika

Shyamal @Padmika의 의견에서 Startup.cs를 추가 할 수 있습니까? 이건 중요하다.
마이크

4

IdentityServer를 권장합니다. 이것은 .NET Foundation 프로젝트이며 인증 및 권한 부여에 대한 많은 문제를 다룹니다.

개요

IdentityServer는 OpenID Connect 및 OAuth2와 같은 프로토콜을 사용하여 최신 웹 응용 프로그램 및 API에 대한 싱글 사인온 및 액세스 제어를 구현할 수있는 .NET / Katana 기반 프레임 워크 및 호스트 가능 구성 요소입니다. 모바일, 웹, SPA 및 데스크톱 애플리케이션과 같은 광범위한 클라이언트를 지원하며 새로운 아키텍처와 기존 아키텍처에 통합 할 수 있도록 확장 가능합니다.

더 많은 정보를 원하시면

  • MembershipReboot 및 ASP.NET ID 기반 사용자 저장소 지원
  • 추가 Katana 인증 미들웨어 (예 : Google, Twitter, Facebook 등) 지원
  • EntityFramework 기반 구성 지속성 지원
  • WS- 페더레이션 지원
  • 확장 성

설명서데모를 확인하십시오 .


6
맹목적으로 IdentityServer 구현으로 뛰어 들기 전에 IdentityServer의 실제 사용법을 고려해야합니다.
hanzolo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.