【问题标题】:Windows and form authentication in Web APIWeb API 中的 Windows 和表单身份验证
【发布时间】:2015-10-11 22:57:46
【问题描述】:

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

现在我还需要做windows活动目录认证。还需要由管理员用户配置的基于角色的安全性。

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

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

【问题讨论】:

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


    【解决方案1】:

    我建议你使用OpenId connectIdentityServer3 (.Net) - 它可以很容易地与 AD 集成(你可以在 AD 域内使用客户端的 Kerberos 票证,它还可以在 AD 之外检查用户登录名/密码domain) 并且还有很多开箱即用的示例如何在 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);
      

    【讨论】:

    • 谢谢@stepan 我正在查看相关文档,如果它解决了我的要求,我会标记为完成
    • 不客气。我相信它会解决您的要求,因为我有这方面的工作原型。很快,它需要对代码进行 2 次小的更改才能完全支持 AD。我已将它们的描述放在我的答案中。请随时提出任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2017-03-04
    • 2020-06-21
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多