[asp.net] 기존 프로젝트에 ASP.NET MVC5 ID 인증 추가
웹에서 비슷한 페이지를 많이 보았지만 대부분 기존 페이지 대신 새 프로젝트를 사용하거나 필요한 기능이 없습니다. 그래서 기존 MVC 5
프로젝트가 있으며 ASP.NET MVC5 Identity를 로그인, 전자 메일 확인 및 암호 재설정 기능 과 통합하려고 합니다.
이 외에도 데이터베이스에 필요한 모든 테이블 ( 예 : 사용자, 역할, 그룹 등) 을 만들어야합니다 (프로젝트에서 EF 코드 우선 사용). 이러한 요구에 해당하는 기사 나 샘플이 있습니까? 어떤 제안이라도 감사하겠습니다. 미리 감사드립니다 …
답변
기존 프로젝트에 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.config
OWIN이 시작 클래스를 찾을 수 있도록 이 코드 줄을 파일에 추가하면됩니다 .
<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;
당신은 또한 같은 내 다른 답변 볼 수있는 이 와 이 아이덴티티의 고급 사용.
답변
이것이 Identity를 기존 데이터베이스와 통합하기 위해 수행 한 작업입니다.
-
MVC 템플릿으로 샘플 MVC 프로젝트를 만듭니다. 여기에는 Identity 구현에 필요한 모든 코드 (Startup.Auth.cs, IdentityConfig.cs, 계정 컨트롤러 코드, 컨트롤러 관리, 모델 및 관련보기)가 있습니다.
-
Identity 및 OWIN에 필요한 너겟 패키지를 설치하십시오. 샘플 프로젝트의 참조와 @Sam의 답변을 보면 아이디어를 얻을 수 있습니다.
-
이 코드를 모두 기존 프로젝트에 복사하십시오. Identity가 데이터베이스에 매핑되도록 “DefaultConnection”연결 문자열을 추가해야합니다. “DefaultConnection”연결 문자열에 대한 참조를 찾을 수있는 IdentityModel.cs에서 ApplicationDBContext 클래스를 확인하십시오.
-
이것은 필요한 테이블을 만들기 위해 기존 데이터베이스에서 실행 한 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
-
남은 오류를 확인하고 해결하면 완료됩니다. 정체성은 나머지를 처리합니다 🙂
답변
IdentityServer를 권장합니다. 이것은 .NET Foundation 프로젝트이며 인증 및 권한 부여에 대한 많은 문제를 다룹니다.
개요
IdentityServer는 OpenID Connect 및 OAuth2와 같은 프로토콜을 사용하여 최신 웹 응용 프로그램 및 API에 대한 싱글 사인온 및 액세스 제어를 구현할 수있는 .NET / Katana 기반 프레임 워크 및 호스트 가능 구성 요소입니다. 모바일, 웹, SPA 및 데스크톱 애플리케이션과 같은 광범위한 클라이언트를 지원하며 새로운 아키텍처와 기존 아키텍처에 통합 할 수 있도록 확장 가능합니다.
더 많은 정보를 원하시면
- MembershipReboot 및 ASP.NET ID 기반 사용자 저장소 지원
- 추가 Katana 인증 미들웨어 (예 : Google, Twitter, Facebook 등) 지원
- EntityFramework 기반 구성 지속성 지원
- WS- 페더레이션 지원
- 확장 성