2017-07-11 41 views
1

イントロKerberos認証IE11とChromeで失敗ではなく、Firefoxの

。私は指示hereに従い、hereのコードを使用してユーザーを認証しました。 Firefoxではすべて成功です。下のログインページが期待どおりにポップアップし、私はWindowsログインを使用してログインできます。 enter image description here

ただし、IEとChromeでは認証が失敗します。ログイン画面が表示される代わりに、パスワードを要求するポップアップが表示されます。 Windowsユーザーとパスワードを入力すると、以下の画面が表示されます。 enter image description here ChromeとIEにHTTPエラー500が表示されているにもかかわらず、サーバー側にSpringからのエラーが表示されません。私は、サンプルコードを実行しようとした

研究

は(春・セキュリティのkerberos-サンプル/秒 - サーバー・ウィン-AUTH下)hereを提供し、しかし同じ問題が解消されません。しかし、この場合には、春は

org.springframework.security.authentication.BadCredentialsException: Kerberos validation not successful 
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:71) 
    at org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:64) 
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) 
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) 
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:436) 
    at org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.security.PrivilegedActionException: null 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:422) 
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:68) 
    ... 45 common frames omitted 
Caused by: org.ietf.jgss.GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) 
    at sun.security.jgss.GSSHeader.<init>(GSSHeader.java:97) 
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306) 
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) 
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:170) 
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:1) 
    ... 48 common frames omitted 

は、私は、ユーザーとパスワードが正しいことを確認しました、次のエラーが返されますが、それでもIEとChromeに失敗したが、Firefoxで成功した認証を行います。

さらに、私は、hereのチュートリアルに従って、IEでKerberos認証を許可しようとしました。唯一の違いは、パスワードの入力を求められないが、ページに500のエラーが表示されることです。

質問

は、すべてのブラウザで動作するようにプロジェクトの設定を変更するには私のための方法はあります、またはFirefoxのみで仕事に行くの認証の現在の方法でありますか?

関連ファイル

build.gradle

buildscript { 
    ext { 
     springBootVersion = '1.4.1.RELEASE' 
    } 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'spring-boot' 

jar { 
    baseName = 'vlgx-portal-app' 
    version = '0.0.1-SNAPSHOT' 
} 
sourceCompatibility = 1.7 
targetCompatibility = 1.7 

repositories { 
    mavenCentral() 
} 


dependencies { 
    compile('org.springframework.boot:spring-boot-starter-jersey') 
    compile('org.springframework.boot:spring-boot-starter-security') 
    compile('org.springframework.boot:spring-boot-starter-thymeleaf') 
    compile('org.springframework.boot:spring-boot-starter-web') 
    compile('org.springframework.boot:spring-boot-starter-web-services') 
    compile('org.jsoup:jsoup:1.8.1') 
    compile ('javax.mail:mail:1.4.7') 
    compile 'org.springframework.security.kerberos:spring-security-kerberos-web:1.0.1.RELEASE' 
    compile 'org.springframework.security.kerberos:spring-security-kerberos-client:1.0.1.RELEASE' 
    compile 'org.springframework.security:spring-security-ldap:4.2.3.RELEASE' 
    //runtime('org.postgresql:postgresql') 
    testCompile('org.springframework.boot:spring-boot-starter-test') 
} 

WebSecurityConfig.java

package com.valogix.portal.configuration; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.io.FileSystemResource; 
import org.springframework.security.authentication.AuthenticationManager; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; 
import org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider; 
import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator; 
import org.springframework.security.kerberos.client.config.SunJaasKrb5LoginConfig; 
import org.springframework.security.kerberos.client.ldap.KerberosLdapContextSource; 
import org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter; 
import org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint; 
import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider; 
import org.springframework.security.ldap.search.FilterBasedLdapUserSearch; 
import org.springframework.security.ldap.userdetails.LdapUserDetailsMapper; 
import org.springframework.security.ldap.userdetails.LdapUserDetailsService; 
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; 

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Value("${app.ad-domain}") 
    private String adDomain; 

    @Value("${app.ad-server}") 
    private String adServer; 

    @Value("${app.service-principal}") 
    private String servicePrincipal; 

    @Value("${app.keytab-location}") 
    private String keytabLocation; 

    @Value("${app.ldap-search-base}") 
    private String ldapSearchBase; 

    @Value("${app.ldap-search-filter}") 
    private String ldapSearchFilter; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .exceptionHandling() 
       .authenticationEntryPoint(spnegoEntryPoint()) 
       .and() 
      .authorizeRequests() 
       .antMatchers("/login").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login").permitAll() 
       .and() 
      .logout() 
       .permitAll() 
       .and() 
      .addFilterBefore(
        spnegoAuthenticationProcessingFilter(authenticationManagerBean()), 
        BasicAuthenticationFilter.class); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .authenticationProvider(activeDirectoryLdapAuthenticationProvider()) 
      .authenticationProvider(kerberosServiceAuthenticationProvider()); 
    } 

    @Bean 
    public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
     return new ActiveDirectoryLdapAuthenticationProvider(adDomain, adServer); 
    } 

    @Bean 
    public SpnegoEntryPoint spnegoEntryPoint() { 
     return new SpnegoEntryPoint("/login"); 
    } 

    @Bean 
    public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter(
      AuthenticationManager authenticationManager) { 
     SpnegoAuthenticationProcessingFilter filter = new SpnegoAuthenticationProcessingFilter(); 
     filter.setAuthenticationManager(authenticationManager); 
     return filter; 
    } 

    @Bean 
    public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() { 
     KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider(); 
     provider.setTicketValidator(sunJaasKerberosTicketValidator()); 
     provider.setUserDetailsService(ldapUserDetailsService()); 
     return provider; 
    } 

    @Bean 
    public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() { 
     SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator(); 
     ticketValidator.setServicePrincipal(servicePrincipal); 
     ticketValidator.setKeyTabLocation(new FileSystemResource(keytabLocation)); 
     ticketValidator.setDebug(true); 
     return ticketValidator; 
    } 

    @Bean 
    public KerberosLdapContextSource kerberosLdapContextSource() { 
     KerberosLdapContextSource contextSource = new KerberosLdapContextSource(adServer); 
     contextSource.setLoginConfig(loginConfig()); 
     return contextSource; 
    } 

    @Bean 
    public SunJaasKrb5LoginConfig loginConfig() { 
     SunJaasKrb5LoginConfig loginConfig = new SunJaasKrb5LoginConfig(); 
     loginConfig.setKeyTabLocation(new FileSystemResource(keytabLocation)); 
     loginConfig.setServicePrincipal(servicePrincipal); 
     loginConfig.setDebug(true); 
     loginConfig.setIsInitiator(true); 
     return loginConfig; 
    } 

    @Bean 
    public LdapUserDetailsService ldapUserDetailsService() { 
     FilterBasedLdapUserSearch userSearch = 
       new FilterBasedLdapUserSearch(ldapSearchBase, ldapSearchFilter, kerberosLdapContextSource()); 
     LdapUserDetailsService service = new LdapUserDetailsService(userSearch); 
     service.setUserDetailsMapper(new LdapUserDetailsMapper()); 
     return service; 
    } 

} 

application.properties

server.port = 8096 
customerServiceEmail = "[email protected]" 
errorLogDirectory = "error_log_path" 

app.ad-domain: Domain 
app.ad-server: ad_server 
app.service-principal: HTTP/path_or_something 
app.keytab-location: /tmp/tomcat.keytab 
app.ldap-search-base: dc=example,dc=org 
app.ldap-search-filter: "(| (userPrincipalName={0}) (sAMAccountName={0}))" 

私には忘れてしまったことがあれば、お時間をいただきありがとうございます。

UPDATE

Chromeがいる限り、私はポップアップウィンドウを出るように動作します。

+1

[ここ](https://ping.force.com/Support/PingFederate/Integrations/How-to-configure-support-browsers-for-Kerberos-NTLM)は、この問題を複数のブラウザで扱う記事です。[[こちら](https://productforums.google.com/forum/?hl=en#!category-topic/chrome/report-a-problem-and-get-troubleshooting-help/lIw5ojBDER4)に従う "Chormeヘルプフォーラム" enrtry。 – xerx593

+0

申し訳ありませんが、@ xerx593は研究セクションで述べたはずです。私は同じ結果(最初のリンクでチュートリアルを試したところ、表示されている500のエラーでパスワードの入力は求められません)。今編集してください。 –

答えて

1

私はちょっと迷惑をかけて問題を解決することができました。それはexceptionHandlingは()ポップアップは、ユーザーがそれらを見るために認証されなかったページに接続しようとしたときに、ユーザーとパスワードの入力を求められ、その表示させ

http 
    .exceptionHandling() 
    .authenticationEntryPoint(spnegoEntryPoint()) 
    .and() 
     .authorizeRequests() 
      .antMatchers("/login").permitAll() 
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/login").permitAll() 
      .and() 
     .logout() 
      .permitAll() 
      .and() 
     .addFilterBefore(
       spnegoAuthenticationProcessingFilter(authenticationManagerBean()), 
       BasicAuthenticationFilter.class); 

にありました。ポップアップは、ユーザーを認証するために正しく構成されていないようです。私はこのコードを削除しました

.exceptionHandling() 
.authenticationEntryPoint(spnegoEntryPoint()) 
.and() 

私はすでにユーザーがとにかくリダイレ​​クトされたカスタムログインページを持っていたからです。 IEやChrome、Firefoxでのエラーやユーザーのログインはこれ以上できません。

+0

ここであなた自身の答えを自己採択してください。 –

0

設定上の問題(SPN ... Javaコードではない)のようです。 Kerberosはまったく動作しないと思いますが、FirefoxはNTLMを使用しています。 Chromeは通常、IEの設定を使用します。そして、IEは、Firefoxのより厳格であってよく、悪いチケットを使用して認証を許可しない:

GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) 

あなたがバイオリンを使用して要求を見ることができます - ここsome instructionです。

ダブルあなたのサービスのアカウントをチェックして、SPN:HTTPプロトコルの場合には

setspn.exe -L accountname 

、SPNはHTTP/machineName.your.domain.com

のフォームは、あなたのアプリケーションにアクセスするためのアドレスhttp://machineName.your.domain.comを使用していることを確認しなければなりません。もちろん、URLの後に特定のポート(例:8080)または特定のパスを追加することもできます。ただし、SPNで使用されているのと同じURLを使用してください.IPアドレスは使用しないでください。

また、このガイドに選択的に従うことをお勧めします:SPNEGO SSO using Kerberos

Hereも、マイクロソフトのSPN構築についての古いスレッドです。

任意のSPNが他のアカウントに重複がある場合に検索:

setspn.exe -Q <SPN> 

SetSPN command sytax

SPNの重複は、this questionに記載されているNTLMフォールバックを引き起こす可能性があります。

最後に、不完全なトークン問題 - here are some good answersを検索してください。

関連する問題