身份与活动目录表单ASP.NET MVC 5

问题描述:

我有一个应用程序,我想要使用活动目录与个人身份验证从身份在MVC应用程序。 这个想法是我希望每个用户都可以使用带有AD凭据的表单登录。 并使用Identity管理角色和权限。 我正在努力与欧文,现在我可以用AD进行身份验证。但我不能为用户分配角色或声明,因为我的数据库中没有他们。 如何将身份验证与AD和角色以及个人身份验证声明结合起来? 我用这个tuto进行AD认证。 http://tech.trailmax.info/2016/03/using-owin-and-active-directory-to-authenticate-users-in-asp-net-mvc-5-application/身份与活动目录表单ASP.NET MVC 5

+0

这取决于您在开始项目时选择的内容。如果您选择活动目录,则很难实现,因为在初始选择后,MVC项目中的身份验证很难修改。 – stink

了解此帖旧;但是,想分享我所做的工作。基本想法是用AD进行验证。然后复制Identity中的凭据并将现有的Identity角色应用于新的登录名。 虽然理解,但如果系统要求更改AD密码,则会导致问题。 AD的密码不会使用此代码更新Identity。

其他要考虑的事情是使用AD的组和角色,而不是Identity的。

我从一个实现OWIN和Identity 2.0的应用程序开始。然后我按照上面提到的教程来添加AD身份验证。自从我开始使用Identity和OWIN以来,所有登录代码都已就位。

  • 我引用System.DirectoryServices.AccountManagement
  • 创造了他AdAuthenticationService类
  • 规范的LoginController我存在于的AccountController。在模型验证之后和身份验证代码之前,我将以下代码放入公共异步任务登录(LoginViewModel模型,字符串returnUrl)中。请注意,我在他的代码块中删除了返回。如果AD身份验证正常,我希望它继续通过身份验证。如果没有,它会在返回到登录视图时列出所有'错误'。

    var authenticationManager = HttpContext.GetOwinContext().Authentication; 
        var authService = new AdAuthenticationService(authenticationManager); 
        var authenticationResult = authService.SignIn(model.UserName, model.Password); 
    
        if (authenticationResult.IsSuccess) 
        { 
         ModelState.AddModelError("", "AD Authenticated: " + model.UserName); 
         // we are in 
         // check to see if user exixts in AspNetUsers. If not, add with default role. 
    
         var inAsp = UserManager.Users.Any(x => x.UserName == model.UserName); 
         if (!inAsp) 
         { 
          ModelState.AddModelError("", "Did not find User: " + model.UserName); 
          var newUser = new ApplicationUser 
          { 
           UserName = model.UserName, 
           Email = model.UserName + "@a_company.com" 
          }; 
          ModelState.AddModelError("", "Set new user " + model.UserName); 
          // Add the AD user as an Identity user so we can relate a role to AD Login. 
          var chkUser = UserManager.Create(newUser, model.Password); 
          ModelState.AddModelError("", "Created new user: " + model.UserName + " Error: " + string.Join("\n", chkUser.Errors.ToArray())); 
    
          //Add default User to Role Admin 
          if (chkUser.Succeeded) 
          { 
           ModelState.AddModelError("", "Created Identity user: " + newUser.UserName); 
           var result1 = UserManager.AddToRole(newUser.Id, "PM"); 
           if (result1.Succeeded) 
            ModelState.AddModelError("","Added PM role to user: " + newUser.UserName); 
          } 
         } 
        } 
    

陷阱是:

  • 不具有在IdentityConfig.cs文件匹配的广告的密码验证标准的密码验证。
  • 没有将我的AppPool标识设置为LocalSystem。

共享视图_LoginPartial.cshtml和_Layout.cshtml已经正确编码。