将ASP.NET MVC5身份validation添加到现有项目
我在网上看到了很多类似的网页,但是其中大部分使用新的项目而不是现有的项目,或者没有必要的function。 所以,我有一个现有的MVC 5
项目,并希望集成ASP.NET MVC5身份与login,电子邮件确认和密码重置function。
除此之外,我还需要在数据库(即用户,angular色,组等)上创build所有必要的表 (我在项目中使用EF代码优先)。 有没有符合这些需求的文章或样本? 任何build议,将不胜感激。 提前致谢…
configuration身份到现有的项目并不困难。 你必须安装一些NuGet包并做一些小configuration。
首先在包pipe理器控制台中安装这些NuGet包:
PM> Install-Package Microsoft.AspNet.Identity.Owin PM> Install-Package Microsoft.AspNet.Identity.EntityFramework PM> Install-Package Microsoft.Owin.Host.SystemWeb
添加一个用户类和IdentityUser
inheritance:
public class AppUser : IdentityUser { //add your custom properties which have not included in IdentityUser before public string MyExtraProperty { get; set; } }
为angular色做同样的事情:
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> }
如果您使用相同的连接string并启用迁移EF为您创build必要的表。
您可以select扩展UserManager
以添加您所需的configuration和自定义:
public class AppUserManager : UserManager<AppUser> { public AppUserManager(IUserStore<AppUser> store) : base(store) { } // this method is called by Owin therefore 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的,因此您还需要configurationOWIN:
将一个类添加到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可以find您的启动类。
<appSettings> <!-- other setting here --> <add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" /> </appSettings>
现在在整个项目中,您可以使用Identity,就像VS已经安装了新项目一样。 例如,考虑login操作
[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); AuthManager.SignIn( new AuthenticationProperties { IsPersistent = false }, ident); return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home")); } } ModelState.AddModelError("", "Invalid username or password"); return View(login); }
您可以创buildangular色并添加到您的用户:
public ActionResult CreateRole(string roleName) { var roleManager=HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>(); if (!roleManager.RoleExists(roleName)) roleManager.Create(new AppRole(roleName)); // rest of code }
你可以添加任何angular色给这样的任何用户:
UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName");
通过使用Authorize
您可以保护您的操作或控制器:
[Authorize] public ActionResult MySecretAction() {}
要么
[Authorize(Roles = "Admin")]] public ActionResult MySecretAction() {}
你也可以安装额外的软件包并configuration它们来满足你的要求,比如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模板创build一个示例MVC项目。 这具有Identity实现所需的所有代码 – Startup.Auth.cs,IdentityConfig.cs,Account Controller代码,Manage Controller,Models和相关视图。
-
为Identity和OWIN安装必要的nuget软件包。 您将通过查看示例项目中的参考和@Sam的答案来了解一个想法
-
将所有这些代码复制到您的现有项目。 请注意,不要忘记添加Identity的“DefaultConnection”连接string以映射到数据库。 请检查IdentityModel.cs中的ApplicationDBContext类,您将在其中find对“DefaultConnection”连接string的引用。
-
这是我在现有数据库上运行的SQL脚本来创build必要的表:
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基础项目,涵盖许多关于authentication和授权的问题。
概观
IdentityServer是基于.NET / Katana的框架和宿主组件,允许使用OpenID Connect和OAuth2等协议为现代Web应用程序和API实现单点login和访问控制。 它支持广泛的客户端,如移动,Web,SPA和桌面应用程序,并且可以扩展以允许集成到新的和现有的体系结构中。
有关更多信息,例如
- 支持MembershipReboot和基于ASP.NET标识的用户存储
- 支持额外的Katanaauthentication中间件(例如Google,Twitter,Facebook等)
- 支持基于EntityFramework的持久化configuration
- 支持WS-Federation
- 可扩展性
检查文档和示例 。