1

我有一個應用程序,我想要使用活動目錄與個人身份驗證從身份在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

回答

2

瞭解此帖舊;但是,想分享我所做的工作。基本想法是用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已經正確編碼。