获取登录WebApp (JAVA)的windows用户



我已经被这个任务困了好几天了。在我的web应用程序的登录表单中,在用户输入用户名和密码之前,我想在请求中收到他的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

之后,我创建了相关的keytab:

ktpass -out C:temptest.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但是我不能使它工作…

和华夫饼一样…在我的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用户的请求。

Thanksssss

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

我将尽可能详细地公布整个过程,这样就不会有人遭受我所遭受的痛苦。

在这个过程中,我使用了DEV-MITROL领域的三台计算机。本地:

  • 域控制器:主机名:ar - srv - dc - 007用户:管理员通过:somePass40

  • Tomcat机:ip: 192.168.40.91(我在DC上创建了一个dns条目,将这个ip解析为santi.dev-mitrol.net)用户:tomcat通过:tomcatPass40

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

步骤:

1)使用创建SPN的Administrator用户登录DC:

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

2)在"管理工具>Active Directory用户和计算机"中找到用户"tomcat",并在"委托"选项卡中选择"信任此用户以委托给任何服务(仅Kerberos)",并在"帐户"选项卡中选择"帐户选项",勾选"不需要Kerberos预认证"。

3)使用以下命令创建keytab:

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。

现在,使用tomcat用户登录并粘贴在此路径上创建的keytab: C:Program FilesApache Software FoundationTomcat 8.5conf

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

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>
在"C:Program FilesApache Software FoundationTomcat 8.5webappsROOT"目录下创建一个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用户的名字。

希望能有所帮助。

最新更新