2015-07-22 131 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。我已经把他们的描述给我的答案。 请随时提出任何问题。 –