获取 windows 用户登录 WebApp (JAVA)

Get windows user logged in on WebApp (JAVA)

几天来我一直坚持这个任务。在我的网络应用程序的登录表单中,在用户输入用户名和密码之前,我想在请求中接收他的用户名 Windows 帐户。经过大量研究,我发现 Kerberos 是我必须使用的,但我不知道如何使用。 我可以访问 Active Directory 服务器,所以我创建了服务主体名称,建立在 Java 到 AD 的连接上,但是我不可能获得 windows 用户。

现在我正在尝试使用 Waffle,正如我读到的那样,就像导入一些 JAR 一样简单,然后在 JSP 文件中获取主体名称(假设是 Windows 用户),但正如我所说,我做不到。

有没有人做过类似的事情??

非常感谢任何帮助,

提前致谢。

更新:

按照您的要求,这是我目前所做的:

在 WServer 2012 R2(我有 AD)上,我创建了一个名为 santi.mitrol.net

的用户

使用以下命令为该用户注册一个 spn:

setspn -A HTTP/santi.mitrol.net santi.mitrol.net

在此之后,我创建了相关的密钥表:

ktpass -out C:\temp\test.keytab -princ HTTP/santi.mitrol.net@DEV-MITROL.LOCAL -mapUser santi.mitrol.net -mapOp set -pass MYPASS -crypto RC4-HMAC-NT -pType KRB5_NT_PRINCIPAL

完成此设置后,我创建了这个项目:https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth/src/main 但我无法让它工作...

Waffle 也一样..在我的 web.xml 我有这个:

<filter-name>SecurityFilter</filter-name>
<!--<filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>-->
<filter-class>net.mitrol.config.activedirectory.CustomFilter</filter-class>

<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>

但是当我从另一台 PC 向我部署在我的 PC 上的 Tomcat 发出请求时,他们会收到输入凭据的提示,这不是我需要的,我只需要接收请求的 Windows 用户登录到发出请求的机器上。

谢谢ssss

好的,两周后,我终于可以让它工作了!!!!

我将 post 尽可能详细地描述整个过程,这样没有人会遭受我所遭受的痛苦。

在这个过程中我在domian DEV中使用了三台电脑-MITROL.LOCAL:

  • 域控制器: 主机名:AR-SRV-DC-007 用户:管理员 通过:somePass40

  • Tomcat 机器: ip: 192.168.40.91 (我在DC上创建了一个dns入口来解析这个IP为santi.dev-mitrol.net) 用户:tomcat 通过:tomcat通过40

  • 客户端机器向 Tomcat 机器发出请求(如果您从与 运行 服务器相同的机器发出请求,它将无法正常工作)

步骤:

1) 使用管理员用户登录 DC y 创建了此 SPN:

setspn -A HTTP/santi.dev-mitrol.net tomcat
setspn -A HTTP/santi.dev-mitrol.net.dev-mitrol.local tomcat

2) 在 "Administrative Tools>Active Directory Users and Computers" 和委派选项卡 select 中找到用户 "tomcat" 选项 "Trust this user for delegation to any service (Kerberos only)" 并在 "Account" 选项卡中,在 "Account Options" 检查 "Do not require Kerberos preauthenication".

3) 使用此命令创建密钥表:

ktpass -princ HTTP/santi.dev-mitrol.net.dev-mitrol.local@DEV-MITROL.LOCAL -mapuser tomcat@DEV-MITROL.LOCAL -pass * -ptype KRB5_NT_PRINCIPAL -out test.keytab

您必须在此处使用的密码是:tomcatPass40.

4) 现在,是时候使用 tomcat 用户登录并粘贴在此路径上创建的密钥表了:

C:\程序Files\Apache软件Foundation\Tomcat8.5\conf\

除此之外,您还必须在此文件夹中创建另外两个文件:

KRB5.ini

[libdefaults]
default_realm = DEV-MITROL.LOCAL
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
forwardable=true

[realms]
DEV-MITROL.LOCAL = {
kdc = AR-SRV-DC-007
}

[domain_realm]
dev-mitrol.local= DEV-MITROL.LOCAL
.dev-mitrol.local= DEV-MITROL.LOCAL

和JAAS.conf

com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required;
};

com.sun.security.jgss.krb5.accept {
com.sun.security.auth.module.Krb5LoginModule required
storeKey=true
useKeyTab=true
keyTab="file:///C:/Program Files/Apache Software Foundation/Tomcat 8.5/conf/test.keytab"
principal="HTTP/santi.dev-mitrol.net.dev-mitrol.local";
};

5) 编辑同一文件夹中的 web.xml 文件,并包含 SPNEGO 过滤器:

<filter>
    <filter-name>SpnegoHttpFilter</filter-name>
    <filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class>
    <init-param>
        <param-name>spnego.allow.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.localhost</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.unsecure.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.client.module</param-name>
        <param-value>com.sun.security.jgss.krb5.initiate</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.krb5.conf</param-name>
        <param-value>krb5.ini</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.conf</param-name>
        <param-value>jaas.conf</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.server.module</param-name>
        <param-value>com.sun.security.jgss.krb5.accept</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.prompt.ntlm</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.logger.level</param-name>
        <param-value>1</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SpnegoHttpFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

6) 在 "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\ROOT" 中创建一个 JSP 文件,内容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>Hello SPNEGO Example</title>
    </head>
    <body>
        Hello <%= request.getRemoteUser() %> !
    </body>
</html> 

7) 如果您遵循了这些步骤,它应该可以正常工作,您将根据您的请求收到 Windows 用户的姓名。

希望对您有所帮助。