使用基于角色的身份验证创建SIMPLE ASP.NET WebForms应用程序

时间:2015-04-17 19:31:32

标签: c# asp.net webforms

我一直在研究ASP.NET中用户身份验证的两个主要选项,在浏览了几篇文章后,我感到非常困惑。我最后一次涉足ASP.NET时,.NET框架仅在v.2.0上使用了Membership系统。我甚至不记得它是如何工作的,更不用说围绕所有这些新的Entity Framework和Identity的东西。

我喜欢能够使用外部登录(Facebook,Twitter等)和角色的声音,但严重的是,为什么这个废话如此复杂?!我认为ASP.NET应该让开发人员的生活更容易,但只是学习如何使用它似乎需要一个星期的时间!我已经落后于时间表(这是针对一个单一的项目),而我的主管正在了解我在多长时间内没有产生任何结果。

我只想要一种简单,易于学习和使用的方法来创建以下内容:

  1. 一个自定义数据库架构,包含许多额外的用户列(他们必须回答的调查问题)和可能一个模型,尽管我也乐意使用它原始SQL(这对我来说似乎更容易!)。
  2. 一个注册页面,自动对输入的密码进行哈希处理(最好是1000次迭代的PBKDF2,一个32字节的盐以及你为强安全性而建议的任何哈希函数)并重定向到一个自定义的"成员"成功注册时Default.aspx的视图,或回复自身并显示错误(取决于自定义验证逻辑)。
  3. 一个登录页面,也会重定向到相同的自定义Default.aspx并且具有通常的"记住我"复选框。
  4. " admin"角色和"用户"角色,注册添加到用户角色。将手动创建一个管理员用户,但他们将通过相同的登录表单登录,然后会显示一个管理页面,用户可以在其中查看/删除用户及其所有信息。
  5. 我目前有1.和2.只用HTML,CSS,jQuery和SQL实现,然后我开始登录页面,并意识到ASP.NET可能会为我做很多事情。但是如何??

    也许我看起来不够努力,或者我太累了,工作过度而无法完全接受我所读过的内容,但我只想要一个简单,简洁解决方案涵盖所有这些基地在一个地方!淘到谷歌让我无处可去,因为我似乎必须阅读5篇不同的2000字文章才能理解所有这些内容!

    任何可以帮助我的人都将成为我的新神!

1 个答案:

答案 0 :(得分:1)

在阅读了关于这些内容的更多信息并花了最后8个小时之后,我终于成功地推出了自己的自定义身份提供商和数据库。正如蒂姆向我建议的那样,这比使用默认提供商和数据库要困难得多,但我现在几乎完全满意。如果我能弄清楚如何正确命名所创建的表格,我将非常满意这个解决方案。

对于今后遇到这篇文章的人,因为他们有同样的问题,基本步骤是:

  1. 使用JetBrains DotPeek(或任何其他反汇编程序)反汇编Microsoft.AspNet.Identity.EntityFramework.dll并将IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey>的代码复制到您自己的自定义类中。
  2. 根据需要调整列和方法(我删除了PhoneNumberConfirmedTwoFactorEnabled属性,然后为自定义列添加了我想要的属性。
  3. 编写一个基本上如下的自定义<YourDbContextTypeName> : DbContext类:

    public class YourDbContext : DbContext
    {
        public IDbSet<IdentityRole> AspNetRoles { get; set; }
        public IDbSet<IdentityUserClaim> AspNetUserClaims { get; set; }
        public IDbSet<IdentityUserLogin> AspNetUserLogins { get; set; }
        public IDbSet<IdentityUserRole> AspNetUserRoles { get; set; }
        public IDbSet<FitAndStrongUser> AspNetUsers { get; set; }
    
        public YourDbContext() : base("DefaultConnection")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
            modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
            modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
        }
    }
    
  4. Imran Baloch's custom IUserStore, IUserPasswordStore and IUserSecurityStampStore类复制并粘贴到您自己的文件中。

  5. 不要忘记在你的文档中给予Imran应有的信誉,并在他的博客上留下一个好评,告诉他他的代码对你有多大帮助!我也不反对被提及,但我并不是为了这个信用而张贴这个...我发布它是希望一些可怜的闷棍会发现它有用并赢得了奖励。我不得不像我一样浪费一整天!

  6. 鉴于我已经为您完成了所有调试,如果是这样,这应该只需要几个小时。如果您愿意将PhoneNumberConfirmedTwoFactorEnabled留在您的用户表格中,则可以改为IdentityUserIdentityDbContext而不是一小时。只是不要忘记将自定义IdentityDbContext个实例传递给您的UserStore构造函数(那个小小的doozy花了我2个小时才弄明白)!

    现在有人这么难以告诉我昨天吗?! :P