2012-10-25 224 views
25

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

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

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

更新:

这是做一些更多的研究SS是考虑这样做可以支持Windows身份验证在未来的商业产品后,我的理解。我在SS谷歌集团的神话中对此进行了阅读。我问这个问题的原因是我的公司使用IWA构建内部应用程序,如果没有IWA,采用SS MVC就很困难。我想我读过你可以将SS MVC网站托管在使用IWA的ASP.NET网站之外,但我还没有尝试过。

+0

我在twitter上与Demis Bellot对话并得到了类似的回应。 '@ChaseFlorell不是我调查过的东西,不再在Win/Active Directory中工作。需要一些研发来发现/解决问题......你应该在下面写下他所说的答案。 –

回答

5

我也迷上了ServiceStack具有集成的Windows身份验证(企业应用程序),关键是要跳过试图把它与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 }); 

它工作的很好。

+0

谢谢你的答案。我会试试这个。 – BrandonG

5

这是什么德米斯贝洛在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; 
        } 
} 
+0

我会尽可能多地为这个答案添加信息。包含上述“更新”中的一些信息,也许包含一些关于如何使用CredentialsAuthProvider的代码。 –

+0

我认为一个很好的折衷办法是使用Forms Authentication。 IWA过去很容易设置,不需要为用户进行设置,但对于较新版本的IE,您必须将该站点添加到受信任的站点,然后编辑安全性以允许传递用户凭据。您可以实施表单身份验证,如果客户端访问该URL,则可以对其凭据进行身份验证,并使用FormsAuthentication.SetAuthCookie()保存cookie。 – BrandonG

+0

这个SO问题将是一个很大的帮助:http://stackoverflow.com/questions/15068774/use-asp-net-authentication-with-servicestack – BrandonG

相关问题