【问题标题】:How to use Servicestack Authentication with Active Directory/Windows Authentication?如何将 Servicestack 身份验证与 Active Directory/Windows 身份验证一起使用?
【发布时间】:2012-10-25 18:14:27
【问题描述】:

我正在创建用户凭据驻留在 Active Directory 中的安全 (SSL) 公共服务。我想利用 ServiceStack 的身份验证并阅读了wiki article。我已经编写了代码来使用 AD 验证用户凭据。我有几个问题。

  1. 我使用哪个身份验证提供程序?凭证、基本身份验证还是自定义?该服务需要 SSL,因此基本身份验证是安全的,但密码将被加密以增加安全性。
  2. 我还需要存储 UserAuth 并缓存 AuthUserSession 吗?
  3. monotouch 客户端是否支持身份验证?

更新 2:我最终使用 CredentialsAuthProvider 制作了一个与 AD 集成的测试 SS 服务。但是,我的最终目标是在客户调用时拥有 1 个作为 api 的站点。所以基本上是一个 SS MVC 网站。

更新:

在做更多研究后,我了解到 SS 正在考虑在未来做一个可能支持 Windows 身份验证的商业产品。我在 SS Google 小组的 mythz 评论中读到了这一点。我问这个 SO 问题的原因是,我的公司使用 IWA 构建内部应用程序,并且在没有 IWA 的情况下很难采用 SS MVC。我想我读到您可以在使用 IWA 的 ASP.NET 站点之外托管 SS MVC 站点,但我还没有尝试过。

【问题讨论】:

  • 我在 Twitter 上与 Demis Bellot 进行了交谈,得到了类似的回应。 @ChaseFlorell Not something I've investigated, don't work in the Win/Active Directory anymore. Requires some R&D to find/resolve the issue...你应该在下面写下他所说的作为答案。

标签: .net authentication active-directory servicestack


【解决方案1】:

我还将 ServiceStack 与集成 Windows 身份验证(用于企业应用程序)连接起来,关键是跳过尝试将其与 ServiceStack 的 AuthProviders 完全集成,因为 IWA 的一般方法不处理您的凭据应用程序代码——它由网络服务器处理。我所做的是:

  1. 在 IIS 中配置站点/应用程序,以便 Windows 身份验证是唯一启用的选项。 (不允许匿名访问。)这意味着 IIS 本身将处理未经身份验证的用户的质询-响应 (HTTP 401/200) 序列,并为您处理该过程的身份验证部分。

  2. 将 ServiceStack 的 IHasRequestFilter(HTTP 预请求过滤器)实现为属性(例如,[AdminOnly])。此过滤器的 RequestFilter 方法从 HttpContext (HttpContext.User.Identity.Name) 中获取当前用户名,从存储库(可能是 SQL 数据库、平面文件等)中查找它,使用 ServiceStack 的 ICacheClient(内存缓存、Redis、等),如果未经授权则抛出 403 HttpError。

完成此操作后,只需将属性添加到所需的类或方法中(在所需的位置将此身份验证/授权添加到服务管道中),并在我的 AppHost 实现中注册所需的缓存提供程序,例如:

 container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false });

效果很好。

【讨论】:

  • 感谢您的回答。我会试试看。
【解决方案2】:

这是 Demis Bellot 在twitter 上所说的话。可能可行,但需要更多研究。

不是我调查过的东西,不能在 Win/Active 中工作 目录了。需要一些研发来发现/解决问题

我最终得到了一个与 AD 合作的原型服务。我实现了 CredentialsAuthProvider。现在这根本与 ASP.NET IWA 无关,但可以轻松检查用户是否在 AD 中。希望这可能对某人有所帮助。

public class LDAPAuthProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
                    {
                        //Check to see if the username/password combo is valid, an exception will be thrown if the username or password is wrong
                        try
                        {
                            DirectoryEntry entry = new DirectoryEntry(ConfigurationManager.AppSettings["TargetOU"], userName, password);
                            object nativeObject = entry.NativeObject;
                        }
                        catch (Exception)
                        {
                            //This means the username/password combo failed
                            return false;
                        }

                        return true;
                    }
}

【讨论】:

  • 我会在这个答案中添加尽可能多的信息。包括上面“更新”中的一些信息,也许还有一些关于你如何使用CredentialsAuthProvider的代码。
  • 我认为一个好的折衷方案是使用表单身份验证。 IWA 过去易于设置且无需用户设置,但对于较新版本的 IE,您必须将该站点添加到您的受信任站点,然后编辑安全性以允许传递用户凭据。您可以实现表单身份验证,如果客户端访问 url,您可以验证他们的凭据并仍然使用 FormsAuthentication.SetAuthCookie() 保存 cookie。
  • 这个 SO 问题会很有帮助:stackoverflow.com/questions/15068774/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多