向现有项目添加 ASP.NET MVC5身份验证

我在网上看到过很多类似的页面,但是大多数都是使用一个新的项目而不是现有的,或者没有必要的功能。因此,我有一个现有的 MVC 5项目,并希望集成 NET MVC5身份登录,电子邮件确认和密码重置的功能。

此外,我还需要在数据库中创建所有的 必要的桌子,例如用户、角色、组等(我在项目中使用了 EF Code-First)。是否有符合这些需要的物品或样品?

148903 次浏览

为现有项目配置标识并不困难。您必须安装一些 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;
}
}

由于 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。

这就是我将 Identity 与现有数据库集成的方法。

  1. 用 MVC 模板创建一个示例 MVC 项目。这里有身份实现-启动所需的所有代码。Identityconfig.cs ,帐户控制器代码,管理控制器,模型和相关视图。

  2. 为 Identity 和 OWIN 安装必要的 Nuget 软件包。通过查看示例项目中的引用和@Sam 给出的答案,您将得到一个想法

  3. 将所有这些代码复制到现有项目中。请注意,不要忘记为 Identity 添加“ DefaultConnection”连接字符串以映射到数据库。请检查 ApplicationDBContext 类的 identitymodel.cs ,您可以在其中找到对“ DefaultConnection”连接字符串的引用。

  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. Check and solve any remaining errors and you are done. Identity will handle the rest :)

我推荐 身份服务器。这是一个 .NET 基金会项目,涵盖了许多关于身份验证和授权的问题。

概述

IdentityServer 是一个。基于 NET/Katana 的框架和宿主组件,允许使用 OpenID Connect 和 OAuth2等协议为现代 Web 应用程序和 API 实现单点登录和访问控制。它支持广泛的客户端,如移动、网络、 SPA 和桌面应用程序,并且可扩展以允许集成到新的和现有的体系结构中。

如欲了解更多资料,例如。

  • 支持基于 MembershipReboot 和 ASP.NET Identity 的用户存储
  • 支持附加的 Katana 身份验证中间件(例如, Twitter、 Facebook 等)
  • 支持基于 EntityFramework 的配置持久性
  • 对 WS-Federation 的支持
  • 可扩展性

看看 文件小样

我知道我可能来晚了。 这是为那些已经完成了一次或多次迁移的人准备的。那些项目工作完美,那些在那里的数据库中有 AspNet 表,但没有相关的控制器,模型和视图。
我也遇到了同样的问题。我在开始时没有激活身份验证就启动了我的项目。然后我意识到我没有所有用于身份验证的元素(在视图文件夹中的 Account 和 Management,在控制器中的 AccountController 和 ManageController,以及在模型中的 AccountViewModel 和 ManageViewModel)。 我刚刚创建和其他项目与类似的设置,名称和我在创建该项目时激活了身份验证。 然后我设法将丢失的文件复制到我的初始项目。 在此之后,我逐一修改名称空间并将其导入到项目的名称空间中