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

Bra*_*onG 25 .net authentication active-directory servicestack

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

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

更新2:我最终使用CredentialsAuthProvider制作了与AD集成的测试SS服务.然而,我的最终目标是在客户打电话时拥有1个api网站.所以基本上是SS MVC网站.

更新:

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

Bra*_*onG 5

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

不是我调查过的东西,不再在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;
                    }
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*nes 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.

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

 container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false });
Run Code Online (Sandbox Code Playgroud)

它工作得很漂亮.