我正在创建一个安全(SSL)公共服务,其中用户凭据位于Active Directory中。我想利用ServiceStack的身份验证并阅读wiki article。我已经编写了代码来验证AD的用户凭据。我有几个问题。
更新2:我最终使用CredentialsAuthProvider制作了与AD集成的测试SS服务。然而,我的最终目标是拥有1个网站,当客户打电话时是api。所以基本上是SS MVC网站。
更新
在进行更多研究后,SS正在考虑做一个可能支持Windows身份验证的商业产品,这是我的理解。我在SS Google小组的mythz评论中读到了这一点。我问这个问题的原因是我的公司使用IWA构建内部应用程序并且在没有IWA的情况下采用SS MVC很难。我想我读过你可以在一个使用IWA的ASP.NET站点上托管SS MVC站点,但我还没有尝试过。
答案 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服务器处理。我做的是:
在IIS中配置站点/应用程序,以便Windows身份验证是唯一启用的选项。 (不允许匿名访问。)这意味着IIS本身将处理未经身份验证的用户的质询 - 响应(HTTP 401/200)序列,并为您处理流程的身份验证部分。
将ServiceStack的IHasRequestFilter
(HTTP预请求过滤器)实现为属性(例如,[AdminOnly])。此过滤器的RequestFilter方法从HttpContext(HttpContext.User.Identity.Name
)获取当前用户名,从存储库(可能是SQL数据库,平面文件等)查找它,使用ServiceStack的ICacheClient
缓存结果(内存)缓存,Redis等),如果未经授权,则抛出403 HttpError。
完成此操作后,所有必要的是将属性添加到所需的类或方法(将所需的身份验证/授权转换到服务管道中),并在我的AppHost实现中注册我想要的缓存提供程序,例如:
container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false });
效果很好。