如何在Active Directory / Windows身份验证中使用Servicestack身份验证?

时间:2012-10-25 18:14:27

标签: .net authentication active-directory servicestack

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

  1. 我使用哪个Auth提供商?凭据,基本身份验证还是自定义?该服务需要SSL,因此Basic Auth是安全的,但密码将被加密以增加安全性。
  2. 我是否仍需要存储UserAuth并缓存AuthUserSession?
  3. monotouch客户端是否支持身份验证?
  4. 更新2:我最终使用CredentialsAuthProvider制作了与AD集成的测试SS服务。然而,我的最终目标是拥有1个网站,当客户打电话时是api。所以基本上是SS MVC网站。

    更新

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

2 个答案:

答案 0 :(得分:5)

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

  

不是我调查过的,不能在Win / Active中工作   目录了。需要一些R& D才能找到/解决问题

我最终得到了一个与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;
                    }
}

答案 1 :(得分:5)

我还使用集成Windows身份验证(用于企业应用程序)连接ServiceStack,关键是要完全避免尝试将其与ServiceStack的AuthProviders集成,因为IWA的一般方法不处理您的凭据应用程序代码 - 由Web服务器处理。我做的是:

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

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

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

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

    效果很好。