电竞比分网-中国电竞赛事及体育赛事平台

分享

Simplemembership實現(xiàn)用戶權(quán)限管理-初步認(rèn)識

 ThinkTank_引擎 2014-02-03

SimplemembershipDotnet MVC4工程內(nèi)置的權(quán)限管理模塊,本系列文章主要是關(guān)于使用Simplemembership如何實現(xiàn)可配置的用戶權(quán)限管理。

首先我們新建一個MVC4工程:

我們看一下新建的工程目錄,和Simplemembership有關(guān)系的內(nèi)容主要在InitializeSimpleMembershipAttribute.cs和AccountModels.cs這兩個文件里。

我們來看一下InitializeSimpleMembershipAttribute.cs。這里我們主要看的是數(shù)據(jù)庫的創(chuàng)建和加載。至于MVC4內(nèi)部對SimpleMembership的實現(xiàn),高人可以去研究一下。本教程不作介紹。

  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數(shù)據(jù)庫結(jié)構(gòu)。

  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,本教程不做詳細(xì)介紹,可以去網(wǎng)上搜索相關(guān)技術(shù)文章。

在運行工程前,我們需要修改一下Web.Config文件的默認(rèn)連接串DefaultConnection指到我們自己的數(shù)據(jù)庫,填好想要的數(shù)據(jù)庫名稱例如SmpleMembershipDB,保存后就可以運行工程。使用Simplemembership,我們看到Web.config文件中并沒有對membership的太多的配置只有一個連接串和一個沒有登錄的返回頁面這兩個信息,新的Simplemembership的配置不像以前需要在web.confg中配置prodiver,已經(jīng)集成在了MVC4里面,簡化了配置。

第一次編譯運行工程成功會看到默認(rèn)的Home Page,這時點擊右上角的Register按鈕我們就可以注冊用戶了,系統(tǒng)會根據(jù)DefaultConnection自動創(chuàng)建Membership的數(shù)據(jù)庫如下圖。

這里有一個問題,有些人可能上來沒有修改DefaultConnection,就運行了程序注冊了用戶,這樣也是可以的,系統(tǒng)會用Visual Studio 2010 安裝的Sqlserver Express版本創(chuàng)建Membership數(shù)據(jù)庫到工程的App_Data目錄下,你會看到一串的數(shù)據(jù)庫名稱MDF文件。但是這顯然不是我們想要的。

系統(tǒng)默認(rèn)創(chuàng)建的UserProfile表十分簡單只有UserId和UserName兩個字段,更具具體的需求我們需要像這個表中添加新的字段,如Email、地址等信息。這個會在下篇文章中分享給大家。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多