25

我正在创建用户凭据驻留在 Active Directory 中的安全 (SSL) 公共服务。我想利用 ServiceStack 的身份验证并阅读了wiki 文章。我已经编写了代码来使用 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 站点,但我还没有尝试过。

4

2 回答 2

5

这是黛米斯·贝洛特在特上所说的。可能有可能,但需要更多研究。

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

我最终确实得到了一个使用 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;
                    }
}
于 2013-04-26T21:33:00.893 回答
5

我还将 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 });

它工作得很好。

于 2013-05-14T19:26:39.577 回答