近和朋友完成了一个大单子架构是mvc5+ef6+Bootstrap,用的是vs2015,数据库是sql server2014。朋友做的架构,项目完成后觉得很多值得我学习,在这里总结下一些心得。
创建项目一开始删掉App_Start目录下的IdentityConfig.cs和Startup.Auth.cs文件;清空Modle文件夹,Controller文件夹和相应的View; 删除目录下的ApplicationInsights.config文件和Startup.cs文件
修改web.config文件(添加<add key="owin:AutomaticAppStartup" value="false"/>不使用Startup.cs文件来启动项目)
<appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="owin:AutomaticAppStartup" value="false"/> <!--去掉创建项目初的Startup.cs文件的设置--> </appSettings>
(不用他们是因为自带的这些内容太冗余)
去掉冗余内容正式开始,首先介绍数据库这一块,数据库我们是配置的可以手动生成和修改的
1.在项目目录想创建Migrations文件夹,里面添加Configuration.cs文件
internal sealed class Configuration : DbMigrationsConfiguration<AccountContext> { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = "UserProject.DAL.AccountContext"; } protected override void Seed(AccountContext context) { //base.Seed(context); } }
在Modle文件夹下添加AccountContext.cs文件
public class AccountContext:DbContext { public AccountContext():base("AccountContext") { } public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } <connectionStrings> <add name="AccountContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\UserProject.mdf;Initial Catalog=UserProject;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
然后 使用vs2015里面的工具-NuGet包管理器-程序包管理控制平台
输入add-migration Initial 按回车,在输入update-database按回车。在App_Data文件夹下就会看到AccountContext数据库了。
2.在Modle文件夹下添加User.css文件
public class User { public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } public Role Role { get; set; } } public enum Role//角色枚举 { 管理员 = 0, 员工 = 1, 经理 = 2, 总经理 = 3, 董事长 = 4 }
在ViewModle文件夹中添加Account.cs文件
public class Account { [Required] public string Name { get; set; } [Required] public string Password { get; set; } public string RePassword { get; set; } }
这里推荐创建BaseController之后的Controller就继承它来使用
public class BaseController : Controller { public string UserName => User.Identity.Name; public AccountContext db = new AccountContext(); private User _userInfo = null; public User CurrentUserInfo { get { if (_userInfo == null) { var user = db.Users.SingleOrDefault(u => u.UserName == UserName);//此处为了不每次访问用户表可以做一个静态类,里面存放用户表信息. _userInfo = user == null ? null : new User() { ID = user.ID, UserName = user.UserName, Role = user.Role }; } return _userInfo; } } //验证角色:获取Action的CustomAttributes,过滤角色 protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); var authRoleAtt = filterContext.ActionDescriptor.GetCustomAttributes(false).SingleOrDefault(att => att is AuthorizeRoleAttribute) as AuthorizeRoleAttribute; if (authRoleAtt == null && CurrentUserInfo != null) return; if (!authRoleAtt.Roles.Contains(CurrentUserInfo.Role)) { filterContext.Result = View("NoPermission", "_Layout", "您没有权限访问此功能!"); } } //这里是记log用 protected override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); var msg = $"用户: {CurrentUserInfo?.UserName}, 链接: {Request.Url}"; if (Request.HttpMethod == "POST") msg += $", 数据: {HttpUtility.UrlDecode(Request.Form.ToString())}"; //Log.Debug(msg); } }
AdminController继承BaseController
[Authorize] public ActionResult Index() { return View(db.Users.ToList()); } [Authorize, AuthorizeRole(Role.管理员)] public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } User user = db.Users.Find(id); if (user == null) { return HttpNotFound(); } return View(user); }
登录页面:
@model UserProject.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" }) <div class="form-group"> @Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="登录" class="btn btn-primary" /> </div> </div> }
登录的Action:
[AllowAnonymous] public ActionResult Login() { return View(); } [HttpPost, AllowAnonymous] public ActionResult Login(Account model) { if (ModelState.IsValid) { var user = db.Users.SingleOrDefault(t => t.UserName == model.Name && t.Password == model.Password); if (user != null) { FormsAuthentication.SetAuthCookie(model.Name, false);//将用户名放入Cookie中 return RedirectToAction("Index"); } else { ModelState.AddModelError("Name", "用户名不存在!"); } } return View(model); } public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Login"); }
按照以上方式 访问Details这个Action的时候必须是管理员角色。
以上所述是小编给大家介绍的基于mvc5+ef6+Bootstrap框架实现身份验证和权限管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如何在Spring Security中实现基于JWT的身份验证和授权 我试图在我的Spring启动应用程序中实现基于jwt的身份验证和授权。我遵循了这里写的教程。但是它在我的应用程序中没有做任何事情。它不返回jwt令牌,而是我被验证了,我的请求得到了满足。我是Spring安全新手。这是我的代码。 我希望我的应用程序返回jwt令牌,并且使用该令牌必须授权请求。 这是我的密码。 ilter.java
本文向大家介绍基于spring boot 2和shiro实现身份验证案例,包括了基于spring boot 2和shiro实现身份验证案例的使用技巧和注意事项,需要的朋友参考一下 Shiro是一个功能强大且易于使用的Java安全框架,官网:https://shiro.apache.org/。 主要功能有身份验证、授权、加密和会话管理。 其它特性有Web支持、缓存、测试支持、允许一个用户用另一个用户
在使用通过IdP对其用户进行身份验证的web应用程序中,实现用户权限(客户端和服务器端)的更标准/推荐的选项是什么? 我所说的“用户权限”指的是用户在应用程序中可以或不可以执行的操作。 例如,假设应用程序有一个“管理”页面,用于管理应用程序的一些设置,只有特定的用户才允许进入。其中一些用户只被允许查看当前设置,而其他用户也被允许更改设置(可能只有其中一些)。 据我所知,oauth2中的“作用域”概
我们在MVC 5中有一个Web应用程序。它使用OWIN进行身份验证。现在我们有这样的情况,请求可能来自特定的服务器,该服务器在超文本传输协议头部发送用户名(以及一些密码信息来证明它是正确的服务器)。 在上述情况下,应用应该使用头字段中的给定名称向用户(身份)进行身份验证,而不必写入任何cookie或执行其他身份验证操作。我已经搜索了网络,在我看来,我必须在FilterConfig中添加一个自定义的
本文向大家介绍基于javascript简单实现对身份证校验,包括了基于javascript简单实现对身份证校验的使用技巧和注意事项,需要的朋友参考一下 本文实例介绍了javascript简单实现对身份证的校验的关键性代码,分享给大家供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家实现javascript身份证校验有所帮助。