我目前正在构建一个 Java-servlet 应用程序(具体来说,在 GlassFish 上使用 Jersey)。在应用程序的某些部分,我需要使用基本身份验证对用户进行身份验证,而在其他一些部分,我需要使用客户端证书。使用哪一个将取决于请求的路径。例如 /cert/secretMethod1 或 /basic/secretMethod2 。
我怎么做?下面是我当前的 web.xml,它目前只进行基本的身份验证。我想我需要使用两种不同的,但我更愿意只使用一种身份验证领域。是否有 web.xml 的标签/属性使我能够为应用程序的不同路径指定不同的身份验证方法?
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>
TestServer
</display-name>
<servlet>
<description>Jersey servlet</description>
<display-name>Jersey servlet</display-name>
<servlet-name>JerseyServlet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JerseyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>TestServer</display-name>
<web-resource-collection>
<web-resource-name>TestServer</web-resource-name>
<description></description>
<url-pattern>/</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<description>Have to be a USER</description>
<role-name>User</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jpaCustomRealm</realm-name>
</login-config>
<security-role>
<description/>
<role-name>User</role-name>
</security-role>
</web-app>
Run Code Online (Sandbox Code Playgroud) 使用 Apache2,除了这些任何人都可以看到的特殊页面之外,我如何要求每个页面都有一个有效用户?
预先感谢您的想法。
根据评论更新;这是一个有效的 apache2 配置:
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
Order allow,deny
allow from all
</Directory>
# require authentication for everything not specificly excepted
<Location / >
AuthType Basic
AuthName "whatever"
AuthUserFile /etc/apache2/htpasswd
Require valid-user
AllowOverride all
</Location>
# allow standard apache icons to be used without auth (e.g. MultiViews)
<Location /icons>
allow from all
Satisfy Any
</Location>
# anyone can see pages in this tree
<Location /special_public_pages>
allow from all
Satisfy …Run Code Online (Sandbox Code Playgroud) 我刚刚在我的计算机上设置了 ubuntu 9.10,我正在尝试弄清楚如何避免在需要 sudo 权限的每个操作中输入密码。我只想在登录时输入一次密码,并在整个会话期间拥有所有权限。此外,我宁愿不以 root 身份登录,而是使用我自己的用户名和设置。谢谢。
我已将 Apache 配置为使用mod_auth_kerberos. 到目前为止,对于连接到 Active Directory 并启用了 NTLM 浏览器的客户端来说,一切都运行良好。
当客户端不在域中或浏览器配置为不自动进行身份验证时,他们会收到 2 login prompt 的提示。
第一个登录提示是空白的,第二个是我们配置的oen
首次登录提示:

第二次登录提示:

从日志(第一次身份验证):
[Wed Jan 06 15:47:29 2010] [debug] src/mod_auth_kerb.c(1684): [client x.x.x.x] [pid 2562] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
Run Code Online (Sandbox Code Playgroud)
在第一个登录提示中,我可以为用户名和密码输入任何文本。提交第一个登录表单后,它将要求第二个登录提示。
Apache 有以下配置:
<Directory /web/apache2/htdocs>
AllowOverride All
AuthType Kerberos
AuthName "Staff Access ONLY Kerb-Auth"
KrbAuthRealms EXAMPLE.COM
Krb5Keytab /etc/httpd/conf.d/example.ktab
Allow from localhost
Require valid-user
<Directory>
Run Code Online (Sandbox Code Playgroud)
第一次身份验证的原因可能是什么,我该如何摆脱它们?
我有一个使用Windows 身份验证的 Intranet 站点。当系统提示用户输入凭据时,他们输入:
User: domain\username
Pass: SomePassword
Run Code Online (Sandbox Code Playgroud)
如果他们可以省略domain\将用默认域填充的部分,那就太好了。我愿意放弃使用服务器/机器帐户(非域)登录的能力,因为无论如何我们都不使用它。
这似乎可以通过 BasicAuth 实现,但我似乎无法找到有关如何使用 WindowsAuth 执行此操作的参考。
问题:用户连接到机器上的服务,例如 IIS 网站或 SQL Server 数据库。站点或数据库需要访问网络资源,例如文件共享(最常见)或不同服务器上的数据库。权限被拒绝。
这是因为运行该服务的用户首先没有网络权限,或者如果有,则它无权访问远程资源。
我一遍又一遍地遇到这个问题,并且厌倦了没有一个真正可靠的方法来处理它。
以下是我所知道的一些解决方法:
以被授予高权限的自定义域用户身份运行 IIS
如果一次只授予一个文件共享权限,那么每次我想从新共享中读取时,我都必须要求网络管理员为我添加它。最终,随着许多网站从许多共享中读取,它会变得非常复杂。如果只是为用户打开了访问我们域中的任何文件共享的权限,那么这似乎是一个不必要的安全表面区域。
这也适用于在 IIS 上运行的所有站点,而不仅仅是需要访问的选定站点或虚拟目录,这是进一步的表面积问题。
做同样的事情,但使用应用程序池或单独设置凭据
不必以特定用户身份运行整个 IIS 实例:可以将每个站点、应用程序和文件夹设置为在特定应用程序池或手动选择的一组凭据下运行。这解决了表面积问题的一小部分,但并没有真正解决有关管理权限粒度和跨许多资源这样做的其他问题。
仍然使用 IUSR 帐户但给它网络权限并在远程资源上设置相同的用户名(不是域用户,本地用户)
这也有它的问题。例如,我正在使用一个文件共享,我拥有共享的完全权限,但我无法登录计算机。所以我必须找到合适的管理员并让他为我做这件事。任何时候必须更改,这是对管理员的另一个请求。
允许 IIS 用户以匿名方式连接,但将用于匿名访问的帐户设置为高权限帐户
这甚至比给予 IIS IUSR 完全权限更糟糕,因为这意味着我的网站首先不能使用任何类型的安全性。
使用 Kerberos 连接,然后委托
这在原则上听起来不错,但有各种各样的问题。首先,如果您使用的虚拟网站的域名不是基本机器名称(我们经常这样做),那么您必须使用 Microsoft 的 Web 服务器上的服务主体名称SetSPN 实用程序。它很复杂,而且显然容易出错。此外,您必须要求您的网络/域管理员更改 Web 服务器和域帐户的安全策略,以便他们“受信任进行委派”。如果您没有完全正确地完成所有事情,那么突然之间您想要的 Kerberos 身份验证是 NTLM,并且您只能模拟而不是委托,因此无法以用户身份通过网络进行访问。还,
创建获取网站资源的服务或 COM+ 应用程序
服务和 COM+ 包使用它们自己的一组凭据运行。作为高权限用户运行是可以的,因为他们可以确保自己的安全并拒绝不合法的请求,将控制权交给应用程序开发人员而不是网络管理员。问题: 我正在使用一个 COM+ 程序包,它在 Windows Server 2000 上正是这样做的,以将高度敏感的图像传送到安全的 Web 应用程序。我尝试将网站移至 Windows Server 2003,但突然被拒绝实例化 COM+ 对象的权限,很可能是注册表权限。我摸索了很多,并没有解决问题,部分原因是我不愿意给 IUSR 帐户完整的注册表权限。这似乎与仅以高权限用户身份运行 IIS 一样糟糕。
注意:这实际上非常简单。在您选择的编程语言中,您创建一个带有函数的类,该函数返回您想要的对象的实例(例如 ADODB.Connection),并构建一个 dll,您将其注册为 COM+ 对象。在您的 Web 服务器端代码中,您创建类的实例并使用该函数,并且由于它在不同的安全上下文下运行,因此对网络资源的调用有效。
将驱动器号映射到共享
这理论上可行,但在我看来,这并不是一个好的长期策略。尽管可以使用特定凭据创建映射,并且这可以由网络管理员以外的其他人完成,但这也意味着共享驱动器过多(小粒度)或对整个文件授予过多权限服务器(大粒度)。另外,我还没有弄清楚如何映射驱动器以便 IUSR …
我为所有 Subversion 用户使用一个 ssh 帐户。他们将他们的公钥发送给我,我将它们放在 svn 帐户的 .ssh/authorized_key 中,然后他们可以使用 ssh 隧道从 Subversion 中查看代码。
到目前为止一切正常。但问题是我想让一段时间(比如一个月)没有使用过的密钥无效。有没有人知道在用户登录时让 sshd 记录公钥的方法?
谢谢。
我一直在绞尽脑汁试图让 Windows 7 对 MIT Kerberos 5 Realm(它在 Arch Linux 服务器上运行)进行身份验证。
我在服务器(又名 dc1)上完成了以下操作:
addpol 用户 管理员 addpol 主机 ank -policy 用户 tom@TNET.LOC ank -policy admin tom/admin@TNET.LOC ank -policy 主机主机/wdesk3.tnet.loc -pw MYPASSWORDHERE
然后我对 Windows 7 客户端(又名 wdesk3)执行以下操作:
ksetup /SetRealm TNET.LOC ksetup /AddKdc dc1.tnet.loc ksetip /SetComputerPassword MYPASSWORDHERE ksetip …
我的组织有一台 Cisco ASA 5510,我已将其用作我们其中一个办公室的防火墙/网关。远程用户会寻找的大多数资源都存在于内部。我已经实现了通常的交易 - 带有出站 NAT 的基本内部网络,一个主要的外部接口,在 PAT 池中有一些辅助公共 IP 用于面向公众的服务,一对站点到站点的 IPSec 链接到其他分支,等等。 -我现在正在研究 VPN。
我有 WebVPN(无客户端 SSL VPN)工作,甚至遍历站点到站点的链接。目前,我正在为胖客户端 VPN 保留一个传统的 OpenVPN AS。我想做的是对所有 VPN 的身份验证方法进行标准化,然后切换到 Cisco 的 IPSec 厚 VPN 服务器。
我试图弄清楚这些 VPN 用户(厚客户端和无客户端)的身份验证真正可能是什么。我的组织使用 Google Apps,我们已经使用dotnetopenauth对几个内部服务的用户进行身份验证。我希望能够为瘦 VPN 和厚 VPN 做同样的事情。
或者,使用 RSA 公钥对(ssh-keygen 类型)的基于签名的解决方案将有助于识别 user@hardware。
我试图摆脱旧的用户名/密码身份验证,特别是如果它是 Cisco 内部的(只是另一个密码设置来管理和供用户忘记)。我知道我可以映射到现有的 LDAP 服务器,但我们只为大约 10% 的用户群(主要是 Linux shell 访问的开发人员)创建了 LDAP 帐户。
我想我正在寻找的是一个中间件,它在 Cisco 看来是一个 LDAP 服务器,但将与用户现有的 OpenID 身份进行交互。我在 Cisco 中看到的任何内容都没有表明它可以在本机上执行此操作。但是 RSA 公钥将是亚军,并且比独立甚至 LDAP 身份验证要好得多。什么是真正实用的?
在 Apache 中使用基本身份验证(特别是通过 LDAP,但也通过 htpasswd)时,它使 REMOTE_USER 变量可用于下面的 PHP/Ruby/Python 代码——这对于将身份验证卸载到网络服务器非常有用。
在我们的办公环境中,我们有许多内部应用程序通过 SSL 像这样工作,而且都非常安全。但是:Apache 将 PHP_AUTH_USER (=REMOTE_USER) 和 PHP_AUTH_PW 变量暴露给 PHP 中的任何应用程序。(PHP_AUTH_PW 包含用户输入的明文密码。)这意味着应用程序可以获取用户名和密码。大概相同的信息可用于 Python 和 Ruby(所有三个当前都在使用;PHP 正在逐步淘汰)。
那么我怎样才能阻止 Apache 这样做呢?
一种想法是使用 Kerberos Negotiate 身份验证(它不会公开密码并具有作为 SSO 的好处),但对于某些浏览器(Chrome 和某些情况下是 Firefox),它会自动回退到 Basic,从而导致密码再次公开.