首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将ASP.NET MVC5身份验证添加到现有项目

将ASP.NET MVC5身份验证添加到现有项目
EN

Stack Overflow用户
提问于 2015-08-12 16:55:21
回答 4查看 142.6K关注 0票数 185

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

除此之外,我还需要在数据库上创建所有必需的表,即用户、角色、组等(我首先在项目中使用EF代码)。是否有与这些需求相对应的文章或样本?

EN

回答 4

Stack Overflow用户

发布于 2015-08-12 19:24:33

为你现有的项目配置身份并不难。您必须安装一些NuGet包并进行一些小的配置。

首先使用包管理器控制台安装这些NuGet包:

代码语言:javascript
复制
PM> Install-Package Microsoft.AspNet.Identity.Owin 
PM> Install-Package Microsoft.AspNet.Identity.EntityFramework
PM> Install-Package Microsoft.Owin.Host.SystemWeb 

添加一个具有IdentityUser继承的user类:

代码语言:javascript
复制
public class AppUser : IdentityUser
{
    //add your custom properties which have not included in IdentityUser before
    public string MyExtraProperty { get; set; }  
}

对角色做同样的事情:

代码语言:javascript
复制
public class AppRole : IdentityRole
{
    public AppRole() : base() { }
    public AppRole(string name) : base(name) { }
    // extra properties here 
}

将您的DbContext父对象从DbContext更改为IdentityDbContext<AppUser>,如下所示:

代码语言:javascript
复制
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以添加所需的配置和自定义:

代码语言:javascript
复制
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;
    }
}

由于身份是基于OWIN的,因此您还需要配置OWIN:

将类添加到App_Start文件夹(如果需要,也可以添加到其他任何位置)。此类由OWIN使用。这将是您的启动类。

代码语言:javascript
复制
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就可以找到您的启动类。

代码语言:javascript
复制
<appSettings>
    <!-- other setting here -->
    <add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" />
</appSettings>

现在,在整个项目中,您可以像使用VS安装的任何新项目一样使用标识。考虑登录操作,例如

代码语言:javascript
复制
[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);
}

您可以创建角色并添加到您的用户:

代码语言:javascript
复制
public ActionResult CreateRole(string roleName)
{
    var roleManager=HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>();

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

您还可以向用户添加角色,如下所示:

代码语言:javascript
复制
UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName");

通过使用Authorize,您可以保护您的操作或控制器:

代码语言:javascript
复制
[Authorize]
public ActionResult MySecretAction() {}

代码语言:javascript
复制
[Authorize(Roles = "Admin")]]
public ActionResult MySecretAction() {}

您还可以安装其他包并对其进行配置,以满足您的需求,如Microsoft.Owin.Security.Facebook或您想要的任何包。

注意:不要忘记将相关名称空间添加到您的文件中:

代码语言:javascript
复制
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;

你也可以看到我的其他答案,如thisthis,了解身份的高级用法。

票数 308
EN

Stack Overflow用户

发布于 2015-08-18 15:53:20

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

  1. 使用MVC模板创建一个示例MVC项目。这包含了标识实现所需的所有代码- Startup.Auth.cs、IdentityConfig.cs、帐户控制器代码、管理控制器、模型和相关视图。
  2. 为标识和OWIN安装必要的nuget包。通过查看示例项目中的引用和@Sam
  3. 给出的答案,您将获得一个想法,将所有这些代码复制到现有项目中。请注意,不要忘记添加要映射到数据库的标识的"DefaultConnection“连接字符串。请检查IdentityModel.cs中的ApplicationDBContext类,您将在其中找到对"DefaultConnection“连接字符串的引用。
  4. 这是我在现有数据库上运行以创建所需表的SQL脚本:USE "YourDatabse”GO /****** Object: Table dbo.AspNetRoles脚本日期: 16-Aug-15 6:52:25 PM */ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER on GO create Table dbo。AspNetRoles ON PRIMARY GO /******对象: TABLE dbo.AspNetUserClaims脚本日期: 16-Aug-15 6:52:25 PM */ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE dbo主TEXTIMAGE_ON上的AspNetUserClaims GO /******对象: Table dbo.AspNetUserLogins脚本日期: 16-Aug-15 6:52:25 PM */ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE Table dbo。主GO上的AspNetUserLoginsGO /******对象: TABLE dbo.AspNetUserRoles脚本日期: 16-Aug-15 6:52:25 PM */ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE dbo主GO上的AspNetUserRoles对象: TABLE dbo.AspNetUsers脚本日期: 16-Aug-15 6:52:25 PM */ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE dbo.主TEXTIMAGE_ON上的AspNetUsers主TEXTIMAGE_ON上的ALTER Table dbo.AspNetUserClaims WITH CHECK ADD CONSTRAINT FK_dbo.AspNetUserClaims表外键( _dbo.AspNetUsers_UserId UserId)引用dbo。AspNetUsers 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)引用dbo。AspNetUsers ON DELETE CASCADE GO ALTER TABLE dbo.AspNetUserLogins CHECK CONSTRAINT dbo.AspNetUserRoles GO ALTER TABLE dbo.AspNetUserRoles WITH CHECK ADD CONSTRAINT FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId FOREIGN KEY(RoleId)引用dbo。AspNetRoles 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)引用dbo。DELETE CASCADE上的AspNetUsers GO ALTER TABLE dbo.AspNetUserRoles CHECK CONSTRAINT FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId GO
  5. 检查并解决任何剩余的错误,就完成了。Identity将处理其余部分:)
票数 29
EN

Stack Overflow用户

发布于 2016-08-02 03:04:21

我推荐IdentityServer.This是一个.NET Foundation项目,它涵盖了许多关于身份验证和授权的问题。

概述

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

有关更多信息,例如

  • 支持基于MembershipReboot和ASP.NET身份的用户商店
  • 支持额外的片名身份验证中间件(例如,谷歌、推特、脸书等)
  • 支持基于EntityFramework的configuration
  • support

persistence

查看documentationdemo

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31960433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档