简体   繁体   English

为什么Kerberos / SPNEGO身份验证不起作用?

[英]Why Kerberos/SPNEGO authentication doesn't work?

I' developing Java web application using Vaadin framework. 我正在使用Vaadin框架开发Java Web应用程序。 I would like to authenticate users without prompting for username and password. 我想在不提示输入用户名和密码的情况下对用户进行身份验证。 To do that, I would like to implement Kerberos/SPNEGO to inject the stuff in my java code. 为此,我想实现Kerberos / SPNEGO以在我的java代码中注入内容。 All I need is to have domain username of user connecting to webApplication . 我只需要有用户的域用户名连接到webApplication

I followed instructions from the site: https://tomcat.apache.org/tomcat-9.0-doc/windows-auth-howto.html 我按照网站上的说明操作: https//tomcat.apache.org/tomcat-9.0-doc/windows-auth-howto.html

then I did all described here: http://spnego.sourceforge.net/troubleshoot_hellokeytab.html 然后我在这里做了所有描述: http//spnego.sourceforge.net/troubleshoot_hellokeytab.html

Now I have working HelloKDC which returns me: 现在我有工作的HelloKDC返回给我:

Postdated Ticket false
Renewable Ticket false
Initial Ticket false
Auth Time = Tue Jun 18 11:25:22 CEST 2019
Start Time = Tue Jun 18 11:25:22 CEST 2019
End Time = Tue Jun 18 21:25:22 CEST 2019
Renew Till = null
Client Addresses  Null 
Private Credential: C:\tomcat.keytab for 
HTTP/myserver.eu.corp.mycompany.net@EU.CORP.MYCOMPANY.NET
Connection test successful.

Keytab was generated using: Keytab是使用以下生成的:

ktpass -out c:\tomcat.keytab /princ 
HTTP/myserver.eu.corp.mycompany.net@EU.CORP.MYCOMPANY.NET /pass myPass! 
/mapuser serviceUser /crypto AES256-SHA1 /ptype KRB5_NT_PRINCIPAL

Keep in mind, that application server is in myserver. 请记住,该应用程序服务器位于myserver中。 EU .CORP.MYCOMPANY.NET, while the users are from CORP.MYCOMPANY.NET domain. EU .CORP.MYCOMPANY.NET,而用户来自CORP.MYCOMPANY.NET域。

protected void init(VaadinRequest request) {  
    System.out.println("5 " + request.getRemoteUser());
}

returns null. 返回null。

Tomcat web.xml: Tomcat web.xml:

<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>false</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>false</param-value>
</init-param>

<init-param>
    <param-name>spnego.login.client.module</param-name>
    <param-value>spnego-client</param-value>
</init-param>

<init-param>
    <param-name>spnego.krb5.conf</param-name>
    <param-value>C:\Program Files\Apache Software Foundation\Tomcat 9.0\bin\krb5.conf</param-value>
</init-param>

<init-param>
    <param-name>spnego.login.conf</param-name>
    <param-value>C:\Program Files\Apache Software Foundation\Tomcat 9.0\conf\login.conf</param-value>
</init-param>

<init-param>
    <param-name>spnego.preauth.username</param-name>
    <param-value></param-value>
</init-param>

<init-param>
    <param-name>spnego.preauth.password</param-name>
    <param-value></param-value>
</init-param>

<init-param>
    <param-name>spnego.login.server.module</param-name>
    <param-value>spnego-server</param-value>
</init-param>

<init-param>
    <param-name>spnego.prompt.ntlm</param-name>
    <param-value>false</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>*.jsp</url-pattern>
</filter-mapping>

krb5.conf: krb5.conf的:

[libdefaults]
default_realm = EU.CORP.MYCOMPANY.NET
default_tkt_enctypes = aes256-cts aes256-cts-hmac-sha1-96 aes128-cts-    hmac-sha1-96 aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc arcfour-hmac arcfour-hmac-md5 
default_tgt_enctypes = aes256-cts aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc arcfour-hmac arcfour-hmac-md5 
permitted_enctypes = aes256-cts aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc arcfour-hmac arcfour-hmac-md5
forwardable=true
[realms]
EU.corp.mycompany.net = {
kdc = EUGBDC001.EU.CORP.MYCOMPANY.NET:88
default_domain = EU.CORP.MYCOMPANY.NET
}
[domain_realm]
eu.corp.mycompany.net= EU.CORP.MYCOMPANY.NET
.eu.corp.mycompany.net= EU.CORP.MYCOMPANY.NET

login.conf: login.conf的:

spnego-client {
com.sun.security.auth.module.Krb5LoginModule required;
};

spnego-server {
com.sun.security.auth.module.Krb5LoginModule required
storeKey=true
useKeyTab=true
keyTab="file:///C:/tomcat.keytab"
principal="HTTP/myserver.eu.corp.mycompany.net@EU.CORP.MYCOMPANY.NET";
};

It seems that there is no proper authentication. 似乎没有适当的身份验证。 What am I doing wrong? 我究竟做错了什么?

After many days of looking for options I found resolution for my case. 经过多天的寻找选择,我找到了解决我案子的方法。

It seems that my filter applied only for *.jsp application. 似乎我的过滤器仅适用于* .jsp应用程序。 I just changed: 我改变了:

<filter-mapping>
  <filter-name>SpnegoHttpFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>

for: 对于:

<filter-mapping>
  <filter-name>SpnegoHttpFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>

It was solved my problem, maybe it will help someone. 它解决了我的问题,也许它会帮助别人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM