分享

Simplemembership实现用户权限管理-初步认识

 ThinkTank_引擎 2014-02-03

SimplemembershipDotnet MVC4工程内置的权限管理模块,本系列文章主要是关于使用Simplemembership如何实现可配置的用户权限管理。

首先我们新建一个MVC4工程:

我们看一下新建的工程目录,和Simplemembership有关系的内容主要在InitializeSimpleMembershipAttribute.cs和AccountModels.cs这两个文件里。

我们来看一下InitializeSimpleMembershipAttribute.cs。这里我们主要看的是数据库的创建和加载。至于MVC4内部对SimpleMembership的实现,高人可以去研究一下。本教程不作介绍。

  1. using System;
  2. using System.Data.Entity;
  3. using System.Data.Entity.Infrastructure;
  4. using System.Threading;
  5. using System.Web.Mvc;
  6. using System.Web;
  7. using WebMatrix.WebData;
  8. namespace TYStudio
  9. {
  10.     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
  11.     public sealed class InitializeSimpleMembership : ActionFilterAttribute
  12.     {
  13.         private static SimpleMembershipInitializer _initializer;
  14.         private static object _initializerLock = new object();
  15.         private static bool _isInitialized;
  16.         public override void OnActionExecuting(ActionExecutingContext filterContext)
  17.         {
  18.             // Ensure ASP.NET Simple Membership is initialized only once per app start
  19.             LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
  20.         }
  21.         private class SimpleMembershipInitializer
  22.         {
  23.             public SimpleMembershipInitializer()
  24.             {
  25.                 Database.SetInitializer<TYStudioMembershipContext>(null);
  26.                 try
  27.                 {
  28.                     using (var context = new TYStudioMembershipContext())
  29.                     {
  30.                         if (!context.Database.Exists())
  31.                         {
  32.                             // Create the SimpleMembership database without Entity Framework migration schema
  33.                             ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
  34.                         }
  35.                     }
  36.                     WebSecurity.InitializeDatabaseConnection("TYStudioUsersConnectionString", "UserProfile", "UserId", "UserName", autoCreateTables: true);
  37.                 }
  38.                 catch (Exception ex)
  39.                 {
  40.                     throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
  41.                 }
  42.             }
  43.         }
  44.     }
  45. }

 

AccountModels.cs里面是用户管理页面的一些基本的ViewModel,一个UsersContext和UserProfile表的Model映射。以后我们可以通过修改这个文件进行实例化自己的Membership数据库结构。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. using System.Data.Entity;
  6. using System.Globalization;
  7. using System.Web.Security;
  8. namespace TYStudioSimplemembership.Models
  9. {
  10.     public class UsersContext : DbContext
  11.     {
  12.         public UsersContext()
  13.             : base("DefaultConnection")
  14.         {
  15.         }
  16.         public DbSet<UserProfile> UserProfiles { get; set; }
  17.     }
  18.     [Table("UserProfile")]
  19.     public class UserProfile
  20.     {
  21.         [Key]
  22.         [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  23.         public int UserId { get; set; }
  24.         public string UserName { get; set; }
  25.     }
  26.     public class RegisterExternalLoginModel
  27.     {
  28.         [Required]
  29.         [Display(Name = "User name")]
  30.         public string UserName { get; set; }
  31.         public string ExternalLoginData { get; set; }
  32.     }
  33.     public class LocalPasswordModel
  34.     {
  35.         [Required]
  36.         [DataType(DataType.Password)]
  37.         [Display(Name = "Current password")]
  38.         public string OldPassword { get; set; }
  39.         [Required]
  40.         [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
  41.         [DataType(DataType.Password)]
  42.         [Display(Name = "New password")]
  43.         public string NewPassword { get; set; }
  44.         [DataType(DataType.Password)]
  45.         [Display(Name = "Confirm new password")]
  46.         [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
  47.         public string ConfirmPassword { get; set; }
  48.     }
  49.     public class LoginModel
  50.     {
  51.         [Required]
  52.         [Display(Name = "User name")]
  53.         public string UserName { get; set; }
  54.         [Required]
  55.         [DataType(DataType.Password)]
  56.         [Display(Name = "Password")]
  57.         public string Password { get; set; }
  58.         [Display(Name = "Remember me?")]
  59.         public bool RememberMe { get; set; }
  60.     }
  61.     public class RegisterModel
  62.     {
  63.         [Required]
  64.         [Display(Name = "User name")]
  65.         public string UserName { get; set; }
  66.         [Required]
  67.         [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
  68.         [DataType(DataType.Password)]
  69.         [Display(Name = "Password")]
  70.         public string Password { get; set; }
  71.         [DataType(DataType.Password)]
  72.         [Display(Name = "Confirm password")]
  73.         [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
  74.         public string ConfirmPassword { get; set; }
  75.     }
  76.     public class ExternalLogin
  77.     {
  78.         public string Provider { get; set; }
  79.         public string ProviderDisplayName { get; set; }
  80.         public string ProviderUserId { get; set; }
  81.     }
  82. }

InitializeSimpleMembershipAttribute.cs和AccountModels.cs用到了Entityfamework codefirst,本教程不做详细介绍,可以去网上搜索相关技术文章。

在运行工程前,我们需要修改一下Web.Config文件的默认连接串DefaultConnection指到我们自己的数据库,填好想要的数据库名称例如SmpleMembershipDB,保存后就可以运行工程。使用Simplemembership,我们看到Web.config文件中并没有对membership的太多的配置只有一个连接串和一个没有登录的返回页面这两个信息,新的Simplemembership的配置不像以前需要在web.confg中配置prodiver,已经集成在了MVC4里面,简化了配置。

第一次编译运行工程成功会看到默认的Home Page,这时点击右上角的Register按钮我们就可以注册用户了,系统会根据DefaultConnection自动创建Membership的数据库如下图。

这里有一个问题,有些人可能上来没有修改DefaultConnection,就运行了程序注册了用户,这样也是可以的,系统会用Visual Studio 2010 安装的Sqlserver Express版本创建Membership数据库到工程的App_Data目录下,你会看到一串的数据库名称MDF文件。但是这显然不是我们想要的。

系统默认创建的UserProfile表十分简单只有UserId和UserName两个字段,更具具体的需求我们需要像这个表中添加新的字段,如Email、地址等信息。这个会在下篇文章中分享给大家。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多