ASP.NET MVC 5 Identity – Windows Authentication + Custom Authentication Filters
\Models\AuthEntities\Roles.cs |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace CustomWindowsAuthientication.Models.AuthEntities { public class Roles { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public Guid RoleID { get; set; } [Required] public String RoleName { get; set; } public virtual ICollection<Mapping> UserAccessMapping { get; set; } } } |
\Models\AuthEntities\Mapping.cs |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace CustomWindowsAuthientication.Models.AuthEntities { public class Mapping { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public Guid MappingID { get; set; } [Required] public String Account { get; set; } [Required] public Guid RoleID { get; set; } [ForeignKey("RoleID")] public Roles Role { get; set; } } } |
\Models\AuthContext.cs |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using CustomWindowsAuthientication.Models.AuthEntities; namespace CustomWindowsAuthientication.Models { public class AuthContext : DbContext { public DbSet<Roles> Role { get; set; } public DbSet<Mapping> UserMapping { get; set; } public AuthContext() : base("DefaultConnection") {} } } |
\Filters\AuthFilter.cs |
using System; using System.Web.Mvc; using System.Collections.Generic; using System.Linq; using System.Web; using CustomWindowsAuthientication.Models; using CustomWindowsAuthientication.Models.AuthEntities; namespace CustomWindowsAuthientication.Filters { public class AuthFilter : FilterAttribute, IAuthorizationFilter { public String Role { get; set; } public void OnAuthorization(AuthorizationContext filterContext) { if(!Auth(Role)) HttpContext.Current.Response.Redirect("~/"); } private Boolean Auth(String Role) { AuthContext db = new AuthContext(); var list = db.Role.Include("UserAccessMapping").Where(x => x.RoleName.Equals(Role.Trim())).FirstOrDefault(); Boolean auth = false; if(list != null){ foreach (Mapping item in list.UserAccessMapping) { if (item.Account.ToLower().Equals(HttpContext.Current.User.Identity.Name.ToLower())) { auth = true; } } } return auth; } } } |
\Controllers\HomeController.cs |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using CustomWindowsAuthientication.Filter; using CustomWindowsAuthientication.Models; using CustomWindowsAuthientication.Models.AuthEntities; namespace CustomWindowsAuthientication.Controllers { public class HomeController : Controller { public ActionResult Index() { //AuthContext db = new AuthContext(); //Roles role = new Roles(); //role.RoleName = "Admin"; //db.Role.Add(role); //db.SaveChanges(); //Mapping map = new Mapping(); //map.Account = User.Identity.Name; //map.RoleID = db.Role.First().RoleID; //db.UserMapping.Add(map); //db.SaveChanges(); return View(); } [AuthFilter(Role = "Admin")] public ActionResult Admin() { … … return View(); } … … } } |
更改 web.conf 下列部分 |
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v110;… …;Initial Catalog=aspnet-DbMigrationExample;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> |
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=VMSER001;Initial Catalog=MVCCodeFirst;Persist Security Info=True;User ID=sa;Password=P@ssw0rd" providerName="System.Data.SqlClient" /> </connectionStrings> |