asp.net-mvc-4 - 具有定制角色的MVC 4内部网身份验证

  显示原文与译文双语对照的内容
0 0

我花了一些时间搜索,发现答案很多困惑,所以我将张贴在这里说明。

我使用MVC4 VS2012创建了Intranet站点使用域身份验证。 一切运行正常。 但是,要管理的用户有权访问此web app的不同区域我不喜欢使用AD组我无法管理也找不到用户的web app的。

还有别的选择? 我想这样做涉及到associating/storing域名属于自定义角色和使用授权属性来控制访问。

[Authorize(Roles = "Managers")]

谁能推荐的最佳模式这个或点我怎么走?

我看到一个类似解决方案链接,但我还是不知道如何使用此与存储角色列表并验证用户与这些角色。? 谁能详细如果这样的解决方法解决问题?

        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;
        }
    }
时间:原作者:1个回答

0 0

我正在使用此配置使用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>

到inicialize角色:

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("YourDomainAdminUser", "Administrator");
   Roles.CreateRole("CustomRole");   
   Roles.AddUserToRole("YourDomainDomainUser", "CustomRole");
 }

在Controller

[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);
        }
    }
}

用户Class

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);
    }
//

在我的应用程序中,自定义角色是固定的。

原作者:
...