基于mvc5+ef6+Bootstrap框架实现身份验证和权限管理
近和朋友完成了一个大单子架构是mvc5+ef6+Bootstrap,用的是vs2015,数据库是sqlserver2014。朋友做的架构,项目完成后觉得很多值得我学习,在这里总结下一些心得。
创建项目一开始删掉App_Start目录下的IdentityConfig.cs和Startup.Auth.cs文件;清空Modle文件夹,Controller文件夹和相应的View;删除目录下的ApplicationInsights.config文件和Startup.cs文件
修改web.config文件(添加<addkey="owin:AutomaticAppStartup"value="false"/>不使用Startup.cs文件来启动项目)
<appSettings> <addkey="webpages:Version"value="3.0.0.0"/> <addkey="webpages:Enabled"value="false"/> <addkey="ClientValidationEnabled"value="true"/> <addkey="UnobtrusiveJavaScriptEnabled"value="true"/> <addkey="owin:AutomaticAppStartup"value="false"/><!--去掉创建项目初的Startup.cs文件的设置--> </appSettings>
(不用他们是因为自带的这些内容太冗余)
去掉冗余内容正式开始,首先介绍数据库这一块,数据库我们是配置的可以手动生成和修改的
1.在项目目录想创建Migrations文件夹,里面添加Configuration.cs文件
internalsealedclassConfiguration:DbMigrationsConfiguration<AccountContext> { publicConfiguration() { AutomaticMigrationsEnabled=true; ContextKey="UserProject.DAL.AccountContext"; } protectedoverridevoidSeed(AccountContextcontext) { //base.Seed(context); } }
在Modle文件夹下添加AccountContext.cs文件
publicclassAccountContext:DbContext { publicAccountContext():base("AccountContext"){ } publicDbSet<User>Users{get;set;} protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } <connectionStrings> <addname="AccountContext"connectionString="DataSource=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\UserProject.mdf;InitialCatalog=UserProject;IntegratedSecurity=True"providerName="System.Data.SqlClient"/> </connectionStrings>
然后使用vs2015里面的工具-NuGet包管理器-程序包管理控制平台
输入add-migrationInitial按回车,在输入update-database按回车。在App_Data文件夹下就会看到AccountContext数据库了。
2.在Modle文件夹下添加User.css文件
publicclassUser { publicintID{get;set;} publicstringUserName{get;set;} publicstringPassword{get;set;} publicRoleRole{get;set;} } publicenumRole//角色枚举 {管理员=0,员工=1,经理=2,总经理=3,董事长=4}
在ViewModle文件夹中添加Account.cs文件
publicclassAccount { [Required] publicstringName{get;set;} [Required] publicstringPassword{get;set;} publicstringRePassword{get;set;} }
这里推荐创建BaseController之后的Controller就继承它来使用
publicclassBaseController:Controller { publicstringUserName=>User.Identity.Name; publicAccountContextdb=newAccountContext(); privateUser_userInfo=null; publicUserCurrentUserInfo { get { if(_userInfo==null) { varuser=db.Users.SingleOrDefault(u=>u.UserName==UserName);//此处为了不每次访问用户表可以做一个静态类,里面存放用户表信息. _userInfo=user==null?null:newUser() { ID=user.ID, UserName=user.UserName, Role=user.Role }; } return_userInfo; } } //验证角色:获取Action的CustomAttributes,过滤角色 protectedoverridevoidOnActionExecuting(ActionExecutingContextfilterContext) { base.OnActionExecuting(filterContext); varauthRoleAtt=filterContext.ActionDescriptor.GetCustomAttributes(false).SingleOrDefault(att=>attisAuthorizeRoleAttribute)asAuthorizeRoleAttribute; if(authRoleAtt==null&&CurrentUserInfo!=null) return; if(!authRoleAtt.Roles.Contains(CurrentUserInfo.Role)) { filterContext.Result=View("NoPermission","_Layout","您没有权限访问此功能!"); } } //这里是记log用 protectedoverridevoidOnActionExecuted(ActionExecutedContextfilterContext) { base.OnActionExecuted(filterContext); varmsg=$"用户:{CurrentUserInfo?.UserName},链接:{Request.Url}"; if(Request.HttpMethod=="POST") msg+=$",数据:{HttpUtility.UrlDecode(Request.Form.ToString())}"; //Log.Debug(msg); } }
AdminController继承BaseController
[Authorize] publicActionResultIndex() { returnView(db.Users.ToList()); } [Authorize,AuthorizeRole(Role.管理员)] publicActionResultDetails(int?id) { if(id==null) { returnnewHttpStatusCodeResult(HttpStatusCode.BadRequest); } Useruser=db.Users.Find(id); if(user==null) { returnHttpNotFound(); } returnView(user); }
登录页面:
@modelUserProject.ViewModels.Account @{ ViewBag.Title="Login"; } @using(Html.BeginForm("Login","Admin",FormMethod.Post,new{@class="form-horizontal",role="form"})){ @Html.AntiForgeryToken() <hr/> @Html.ValidationSummary(true,"",new{@class="text-danger"}) <divclass="form-group"> @Html.LabelFor(m=>m.Name,new{@class="col-md-2control-label"}) <divclass="col-md-10"> @Html.TextBoxFor(m=>m.Name,new{@class="form-control"}) @Html.ValidationMessageFor(m=>m.Name,"",new{@class="text-danger"}) </div> </div> <divclass="form-group"> @Html.LabelFor(m=>m.Password,new{@class="col-md-2control-label"}) <divclass="col-md-10"> @Html.PasswordFor(m=>m.Password,new{@class="form-control"}) @Html.ValidationMessageFor(m=>m.Password,"",new{@class="text-danger"}) </div> </div> <divclass="form-group"> <divclass="col-md-offset-2col-md-10"> <inputtype="submit"value="登录"class="btnbtn-primary"/> </div> </div> }
登录的Action:
[AllowAnonymous] publicActionResultLogin() { returnView(); } [HttpPost,AllowAnonymous] publicActionResultLogin(Accountmodel) { if(ModelState.IsValid) { varuser=db.Users.SingleOrDefault(t=>t.UserName==model.Name&&t.Password==model.Password); if(user!=null) { FormsAuthentication.SetAuthCookie(model.Name,false);//将用户名放入Cookie中 returnRedirectToAction("Index"); } else { ModelState.AddModelError("Name","用户名不存在!"); } } returnView(model); } publicActionResultLogOff() { FormsAuthentication.SignOut(); returnRedirectToAction("Login"); }
按照以上方式访问Details这个Action的时候必须是管理员角色。
以上所述是小编给大家介绍的基于mvc5+ef6+Bootstrap框架实现身份验证和权限管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!