ASP.NET MVC 5 Identity – Windows Authentication + Custom Authentication Filters

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>