我花了一些时间搜索,发现了很多令人困惑的答案,所以我会在这里发布澄清.
我使用MVC4 VS2012创建了使用域身份验证的Intranet站点.一切都奏效但是,为了管理可以访问此webapp的不同区域的用户,我不喜欢使用我无法管理的AD组,也不能使用webapp的用户.
有办法吗我认为这将涉及关联/存储属于自定义角色的域名,并使用Authorize属性来控制访问.
[Authorize(Roles = "Managers")]
任何人都可以提出最好的模式,还是指向正确的方向?
我看到一个类似的解决方案link,但我仍然不知道如何使用这个对存储的角色列表,并验证用户对这些角色.任何人都可以详细说明这个解决方案是否可行?
protected void Application_AuthenticateRequest(object sender,EventArgs args) { if (HttpContext.Current != null) { String[] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name); GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity,roles); Thread.CurrentPrincipal = HttpContext.Current.User = principal; } }
解决方法
我正在使用sql Server和MVC3配置.
Web.config文件:
<system.web> <roleManager enabled="true" defaultProvider="sqlRoleManager"> <providers> <clear /> <add name="sqlRoleManager" type="System.Web.Security.sqlRoleProvider" connectionStringName="sqlRoleManagerConnection" applicationName="YourAppName" /> </providers> </roleManager>
….
<authentication mode="Windows" />
….
<connectionStrings> <add name="sqlRoleManagerConnection" connectionString="Data Source=YourDBServer;Initial Catalog=AppServices;Integrated Security=True;" providerName=".NET Framework Data Provider for OLE DB" /> </connectionStrings>
表达角色:
的Global.asax.cs
using System.Web.Security; //// protected void Application_Start() { //You could run this code one time and then manage the rest in your application. // For example: // Roles.CreateRole("Administrator"); // Roles.AddUserToRole("YourDomain\\AdminUser","Administrator"); Roles.CreateRole("CustomRole"); Roles.AddUserToRole("YourDomain\\DomainUser","CustomRole"); }
在你的控制器
[Authorize(Roles ="CustomRole")] public class HomeController : Controller {
管理用户
public class Usuario { public string UserName { get; set; } public string RoleName { get; set; } public string Name { get; set; } public const string Domain = "YourDomain\\"; public void Delete() { Roles.RemoveUserFromRole(this.UserName,this.RoleName); } public void Save() { if (Roles.IsUserInRole(Usuario.Domain + this.UserName,this.RoleName) == false) { Roles.AddUserToRole(Usuario.Domain + this.UserName,this.RoleName); } } }
用户类
public class Usuarios : List<Usuario> { public void GetUsuarios() //Get application's users { if (Roles.RoleExists("CustomRole")) { foreach (string _usuario in Roles.GetUsersInRole("CustomRole")) { var usuario = new Usuario(); usuario.UserName = _usuario; usuario.RoleName = "CustomRole"; this.Add(usuario); } } // public void GetUsuariosRed() //Get Network Users (AD) { var domainContext = new PrincipalContext(ContextType.Domain); var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext,IdentityType.SamAccountName,"Domain Users"); foreach (var item in groupPrincipal.Members) { var usuario = new Usuario(); usuario.UserName = item.SamAccountName; usuario.Name = item.Name; this.Add(usuario); } }
您可以创建一个“Admin”控制器来管理用户:
[Authorize(Roles = "AdminCustomRole")] public class AdminController : Controller { // public ActionResult Index() { var Usuarios = new Usuarios(); Usuarios.GetUsuarios(); return View(Usuarios); } [HttpGet] public ActionResult CreateUser() { var Usuarios = new Usuarios(); Usuarios.GetUsuariosRed(); return View(Usuarios); } //
在我的应用程序中,自定义角色已修复.