2015-07-22 60 views
1

我正在使用AngularJS和.Net Web API進行SPA。我選擇個人帳戶作爲應用程序嚮導中的身份驗證類型。它使用owin提供程序創建了基於聲明的oAuth身份驗證類。Web API中的窗體和窗體身份驗證

現在我還需要做Windows Active Directory認證。還需要一個基於角色的安全性,可由Admin用戶配置。

什麼改變,我需要通過嚮導生成與廣告,如果沒有找到,與目前的OAuth認證的實施,最後返回一個要求令牌客戶端進行身份驗證的用戶我當前的代碼?

我想在應用程序數據庫中存儲我的Active Directory用戶的用戶ID,當他們第一次用他們的AD憑據登錄的。所以,我可以向他們分配角色

回答

1

我建議你使用OpenId connectIdentityServer3(淨)的 - 它可以與AD很容易地集成(你可以使用客戶端的Kerberos票據AD域裏面,它也可以檢查用戶登錄/ AD域以外的密碼),並且還提供了很多開箱即用的示例,說明如何在JavaScript中使用它。所以很容易在我的一個帶.Net後端的AngularJS應用程序中實現它。

此外,IdentityServer還具有在與在InMemoryUserService所有與用戶有關的數據的登錄處理的內存中的用戶緩存。因此,您不必開發用戶相關數據的緩存,它在IdentityServer中也是開箱即用的。

修改它們可以幫助集成AD:

  1. 檢查Windows身份之前渲染登錄頁面是這樣的:
    string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
    如果成功 - 不顯示登錄頁面,進行它的方式就像外部來源(Facebook或Twitter)認證一樣。
  2. 要通過域登錄名和密碼對AD域以外的用戶進行身份驗證,您可以修改InMemoryUserService.cs以檢查它。舉個例子:

    var user_passhash = GetString(GenerateSaltedHash(GetBytes(password))); 
    
        var query = 
         from u in _users 
         where u.Username == username && u.Password == user_passhash 
         select u; 
    
        var user = query.SingleOrDefault(); 
    
        if (user == null) 
        { 
         var domain = ConfigurationManager.AppSettings["domain"]; 
    
         using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain)) 
         { 
          bool isValid = pc.ValidateCredentials(username, password); 
          if (isValid) 
          { 
           EmployeePoco employee = this.employeeManager.GetEmployee(username); 
    
+0

感謝@stepan我期待到的文檔爲,如果它解決了我的要求,我將標誌着完成 – HSharma

+0

歡迎您。我相信它會解決你的需求,因爲我有這個工作原型。不久之後,它需要對代碼進行2次小改動才能完全支持AD。我已經把他們的描述給我的答案。 請隨時提出任何問題。 –