11

我希望将单点登录 (SSO) 添加到我的一个 Web 应用程序中。我现在不想要任何繁重的东西,我只想知道登录用户的 userId,而不需要他们输入用户名。

该网络应用程序是一个内部应用程序,因此我可以保证它们来自 Windows PC 等。

我看过jCIFS,但这似乎不再受支持,并推荐商业产品。

我也看过 WAFFLE,但我正在为不使用 Servlet 堆栈的 playframework 应用程序构建 SSO,因此我无法使用 SecurityFilter。我试图理解 WindowsLoginModule,但无法真正理解我必须做些什么来实现它。

是否可以仅从 HTTP 标头中获取用户名,或者在发布标头之前是否需要先进行一些协商?

4

8 回答 8

2

您希望 windows 用户自动登录到您的 Intranet webapp。因此,用户帐户将位于活动目录中,通常的微软方式是使用NTML oder Kerberos之类的协议。通常建议应用程序不要使用 NTLM,尽管有些企业仍在使用 NTML(和 jCIFS)进行 SSO。

对 Kerberos 和 Java 的快速搜索显示了这篇文章。它似乎依赖于 Java EE 堆栈 (JAAS)。

对于更精简的方法:通常,您不能以可移植的方式在 http 请求中发送用户名。使用 ActivX,您可以:

var wshshell=new ActiveXObject("wscript.shell");
var username=wshshell.ExpandEnvironmentStrings("%username%");

在服务器端,您可以解析 http 标头并使用您选择的技术提取用户名。

那么,在您的 playframework 应用程序中,安全性并不重要?为什么不使用长效cookie?

希望能帮助到你!

于 2010-12-14T14:38:06.547 回答
2

在域中注册了 ActiveDirectory 和工作站的 Intranet 上下文中,HTTP SPNEGONegotiation支持是最佳选择。但它需要围绕 ActiveDirectory 和 Java Kerberos 实现的特定技能。

Spring Security 提供了实现和文档来设置它。但 Secure.Security并非旨在支持基于令牌的身份验证,例如 HTTP 协商。所以使用 Spring Security 需要一个特定的集成模块。

其他选项是OpenIDshibboleth,但两者都需要专用服务器,可以将其配置为自行执行 SPNEGO。由于可用的 Play 模块,在您的应用程序中的集成将更加容易。

在没有客户端复杂和不安全/不可靠调整的情况下在 HTTP 标头中获取用户名的唯一方法是在浏览器和应用程序服务器之间使用身份验证代理。这些代理中的大多数还支持 Kerberos SPNEGO 作为身份验证手段。

于 2012-05-03T13:25:29.710 回答
1

不重的答案

听起来应该可以让您的运维团队实施一个组策略,它将登录的用户名作为 HTTP 标头发送到网络中。

否则,您的假设是正确的,即 IE 和您的服务器之间存在某种协商“舞蹈”。见这里。也许你可以在你的 Play 代码中伪造这个舞蹈。

沉重的答案

我知道jCIFS并且这个示例使用 servlet 和过滤器,但是可以提取重要的代码位并且可以构建自定义 Play Authenticator(我可以粘贴 Scala 示例覆盖play.api.mvc.Security.Authenticated,但您的答案被标记为 Java)。您只需要请求标头(而不是正文),因此它应该可以在身份验证器中使用。

PS jCIFS自您的帖子以来似乎已经更新,所以我假设您会重新考虑使用破解它。我也对未维护的库持谨慎态度,但有时它们只是达到了成熟度和稳定性,从而减轻了对更多更新的需求。

于 2012-04-30T16:46:40.253 回答
1

Active Directory 使用 Kerberos,因此所有登录的用户都应该有一个 kerberos 票证。一个快速的谷歌发现了这个:

如果您想要 Windows 登录详细信息,我认为这是您唯一的选择。

于 2012-05-06T19:38:02.527 回答
1

您可以尝试使用 Shiro 在您的应用程序中启用 SSO。Shiro id 独立于 servlet,并且由于您的框架不支持 Servlet,因此您可以很容易地使用 Shiro。

您可以在定义 hashPassword 的地方创建一个领域。

您可以配置用户名和 hashPassword 并要求 shiro 使用 hashPassword 验证您的用户。

然后,您将为满足您的 SSO 目的的用户分配角色。

您可以对多个应用程序的用户进行身份验证,因此当用户登录另一个应用程序时,shiro 已经对您进行了身份验证,因此它会立即将您登录到应用程序中。

您可以通过以下链接浏览 shiro 文档(详尽无遗,您应该能够在第一次使用时对其进行配置):-

http://shiro.apache.org/

它为您提供了许多开箱即用的身份验证和授权功能以及安全和密码学模块。

于 2012-05-07T07:00:00.420 回答
0

如果 NTLM 对您来说是一个有效的选择,Jespa可能是 JCIFS 的一个很好的替代品。Jespa(与 JCIFS 不同)支持 NTLM v2 等。它的有限版本(最多 25 个用户)是免费的。

于 2012-05-05T12:36:46.383 回答
0

用户名未在标头中发送。即使是这样,也不应该依赖它,因为精明的用户可能会伪造这些值。

于 2010-12-14T14:18:24.173 回答
-2

您始终可以从过滤器中获取任何标题。有关 HttpServletRequest,请参见 javadoc。

于 2010-12-14T14:16:56.313 回答