Web API中的Windows和表单身份验证

时间:2015-07-22 07:42:09

标签: authentication asp.net-web-api oauth

我正在使用AngularJS和.Net Web API开发SPA。我在应用程序向导中选择个人帐户作为身份验证类型。它使用owin提供程序为基于声明的oAuth身份验证创建了类。

现在我还需要进行Windows Active Directory身份验证。还需要一个基于角色的安全性,可由管理员用户配置。

我需要在向导生成的当前代码中对使用AD对用户进行身份验证进行哪些更改,如果在那里找不到,请使用当前的oAuth实现进行身份验证,最后将声明令牌返回给客户端?

我正在考虑在首次使用其AD凭据登录时将我的活动目录用户的用户ID存储在应用程序数据库中。这样我就可以为他们分配角色了

1 个答案:

答案 0 :(得分:1)

我建议您使用OpenId connect IdentityServer3(。Net) - 它可以轻松地与AD集成(您可以在AD域内使用客户端的Kerberos票证,它也可以检查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);