기존 프로젝트에 ASP.NET MVC5 ID 인증 추가
웹에서 비슷한 페이지를 많이 보았지만 대부분 기존 프로젝트 대신 새 프로젝트를 사용하거나 필요한 기능이 없습니다.그래서, 나는 존재합니다.MVC 5
ASP.NET MVC5 ID를 로그인, 전자 메일 확인 및 암호 재설정 기능과 통합하려고 합니다.
또한 데이터베이스에 필요한 모든 테이블을 만들어야 합니다.사용자, 역할, 그룹 등(프로젝트에서 EF Code-First를 사용한 적이 있습니다).이러한 요구에 부합하는 기사나 샘플이 있습니까?
기존 프로젝트에 ID를 구성하는 것은 어렵지 않습니다.일부 NuGet 패키지를 설치하고 일부 작은 구성을 수행해야 합니다.
먼저 Package Manager 콘솔을 사용하여 다음 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;
}
}
ID는 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가 이미 설치한 새 프로젝트와 마찬가지로 전체 프로젝트에서 ID를 사용할 수 있습니다.로그인 작업을 예로 들 수
[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() {}
요구 사항에 도 있습니다. 예를 들어 " 추 패 지 키 를 수 있 습 도 니 다 구 가 할 성 록 도 충 족 하 사 설 항 을 요 구 치 하 같 다 은 고 음 과 ▁you ▁them ▁and 추 ▁require ▁to ment ▁like ▁configure 가 ▁your ▁meet ▁install ▁alsoMicrosoft.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;
또한 ID의 고급 사용을 위해 다음과 같은 다른 답변을 볼 수 있습니다.
이것이 제가 기존 데이터베이스와 아이덴티티를 통합하기 위해 한 일입니다.
MVC 템플릿을 사용하여 샘플 MVC 프로젝트를 만듭니다.이것은 ID 구현에 필요한 모든 코드 - 시작을 포함합니다.Auth.cs , IdentityConfig.cs , 계정 컨트롤러 코드, 관리 컨트롤러, 모델 및 관련 보기.
Identity 및 OWIN에 필요한 Nugget 패키지를 설치합니다.샘플 프로젝트의 참조와 @Sam의 답변을 보면 아이디어를 얻을 수 있습니다.
이 모든 코드를 기존 프로젝트에 복사합니다.데이터베이스에 매핑할 ID에 대한 "기본 연결" 연결 문자열을 추가하는 것을 잊지 마십시오.신청서를 확인해 주세요.IdentityModel.cs 의 DB 컨텍스트 클래스에서 "DefaultConnection" 연결 문자열에 대한 참조를 찾을 수 있습니다.
필요한 테이블을 만들기 위해 기존 데이터베이스에서 실행한 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 프로젝트이며 인증 및 권한 부여와 관련된 많은 문제를 다룹니다.
개요
ID 서버는 입니다.Open과 같은 프로토콜을 사용하는 최신 웹 애플리케이션 및 API에 대해 Single Sign-On 및 액세스 제어를 구현할 수 있는 NET/Katana 기반 프레임워크 및 호스트 가능 구성 요소Connect 및 OAuth2 ID입니다.모바일, 웹, SPA 및 데스크톱 애플리케이션과 같은 광범위한 클라이언트를 지원하며, 새로운 아키텍처와 기존 아키텍처에서 통합할 수 있도록 확장 가능합니다.
자세한 내용은 다음과 같습니다.
- MembershipReboot 및 ASP.NET ID 기반 사용자 저장소 지원
- 추가 카타나 인증 미들웨어 지원(예: Google, Twitter, Facebook 등)
- EntityFramework 기반 구성 지속성 지원
- WS-Federation 지원
- 신축성
글쎄요, 제가 너무 늦었다는 것을 압니다.이것은 이미 하나 이상의 마이그레이션을 수행한 사용자를 위한 것입니다.프로젝트가 완벽하게 작동하는 사람들, 데이터베이스에 AspNet 테이블이 있지만 컨트롤러, 모델 및 관련 뷰가 없는 사람들.
저도 같은 문제를 발견했습니다.처음에 인증을 활성화하지 않고 프로젝트를 시작했습니다.그리고 인증을 위한 모든 요소(Views 폴더의 Account and Manage, 컨트롤러의 AccountController 및 ManageController, 모델의 AccountViewModel 및 ManageViewModel)가 없다는 것을 깨달았습니다.방금 생성한 프로젝트와 유사한 설정, 이름 및 기타 프로젝트를 생성할 때 인증을 활성화했습니다.그리고 나서 나는 잃어버린 파일을 내 초기 프로젝트에 복사할 수 있습니다.그 후, 각각의 네임스페이스를 변경하고 프로젝트의 네임스페이스로 가져오기를 했습니다.
언급URL : https://stackoverflow.com/questions/31960433/adding-asp-net-mvc5-identity-authentication-to-an-existing-project
'programing' 카테고리의 다른 글
Git 병합 충돌 시 생성되는 BACKUP, BASE, LOCAL 및 REMOTE 파일은 무엇입니까? (0) | 2023.06.21 |
---|---|
SQL 구문에 오류가 있습니다(MySQLi SQL 예외가 발견되지 않음).다른 답변을 시도했지만 실패했습니다. (0) | 2023.06.21 |
요구 사항을 사용자 지정하는 방법.여러 환경을 위한 txt? (0) | 2023.06.21 |
컴파일러에서 함수 이름 앞에 밑줄이 붙는 이유는 무엇입니까? (0) | 2023.06.21 |
UTL_FILE.FOPEN() 프로시저가 디렉터리 경로를 수락하지 않습니까? (0) | 2023.06.21 |