jcifs实现Java+AD的SSO解决方案,碰到的问题

本文介绍了在使用jcifs实现Java与Active Directory(AD)单点登录(SSO)过程中遇到的NTLM协议异常问题。文中列举了三种解决方法,包括修改客户端默认协议、使用收费软件Jespa和自行实现NTLM2协议。最终,由于客户数量较少,选择了修改客户端默认协议的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在工作中需要用JAVA与Action Dictionray的单点登陆,碰到了一些问题,总结如下:

常规的操作就不说了,参考http://blog.youkuaiyun.com/freellf/article/details/6385154

问题一:出现异常信息如下:

jcifs.smb.SmbException: The parameter is incorrect.
	at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:563)
	at jcifs.smb.SmbTransport.send(SmbTransport.java:663)
	at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:316)
	at jcifs.smb.SmbSession.send(SmbSession.java:218)
	at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)
	at jcifs.smb.SmbSession.logon(SmbSession.java:147)
	at jcifs.smb.SmbSession.logon(SmbSession.java:140)
	at jcifs.http.NtlmHttpFilter.negotiate(NtlmHttpFilter.java:189)
	at jcifs.http.NtlmHttpFilter.doFilter(NtlmHttpFilter.java:121)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:595)
原因分析:因JCIFS的HttpFilter并不支持NTLM2协议,而当客户端是WIN7系统时,默认采用的是NTLM2协议。如果此时域控服务器也支持NTLM2,则会默认采用NTLM2协议验证。就会出现该异常了。

解决办法1:将客户端的默认协议改为NTLM协议,创建一个reg文件给客户,内容如下:

REGEDIT4

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa]
"LMCompatibilityLevel"=dword:00000001

参考:http://blog.youkuaiyun.com/jjgjlf/article/details/6622928

解决办法2:采用收费版:Jespa  http://www.ioplex.com/

解决办法3:自己实现NTLM2协议部分,工作量比较大啊

 

因客户数量较少,暂时还是采用的解决办法1

<think>根据用户需求,用户需要关于Java实现AzureADSAMLSSO单一登录的示例代码和配置教程。结合站内引用,特别是引用[1]、[3]和[4],可以总结出实现步骤主要分为AzureAD的应用注册和Java应用程序的SAML集成两部分。首先,在AzureAD中注册Java应用程序:1.登录Azure门户,进入AzureActiveDirectory。2.选择“企业应用程序”->“新建应用程序”->“非库应用程序”,填写名称。3.创建后,在应用的“单一登录”选项中选择“SAML”,配置基本SAML设置(如标识符、回复URL等)。4.下载联合元数据文件(FederationMetadataXML)备用。然后,在Java应用中集成SAML:-使用第三方库如java-saml(引用[3]和[4]提到的onelogin库)。-添加依赖(Maven):```xml<dependency><groupId>com.onelogin</groupId><artifactId>java-saml</artifactId><version>2.9.0</version></dependency>```-配置SAML属性(metadata.xml放置于资源目录)。-代码示例:-登录请求处理:使用`Auth#login`重定向到AzureAD登录页。-断言消费:在回调URL中处理SAML响应,提取用户标识。-登出处理:调用`Auth#logout`。接下来,实现步骤会分点详细说明:1.在AzureAD注册应用时,需要明确配置的细节如ACSURL(AssertionConsumerServiceURL)必须匹配Java应用的实际URL(如https://localhost:8080/saml/acs)。2.在Java应用中,通过metadata.xml配置信任关系。引用[3]中的代码展示了如何用onelogin库解析SAML响应。3.安全注意事项:建议使用HTTPS,验证签名等。最后,生成相关问题引导用户深入理解。</think> ### Java实现Azure AD SAML SSO单一登录指南 #### 一、Azure AD配置步骤 1. **注册应用程序** - 登录Azure门户 → Azure Active Directory → 应用注册 → 新注册 - 设置重定向URI:`https://<your-domain>/saml/acs`(需与Java应用路径一致)[^1] - 记录**应用程序(客户端)ID**和**目录(租户)ID** 2. **配置SAML单点登录** ```markdown 企业应用 → 你的应用 → 单一登录 → SAML ↓ 基本SAML配置: - 标识符(实体ID): `https://<your-domain>/saml/metadata` - 回复URL: `https://<your-domain>/saml/acs` ↓ 下载**联合元数据XML**备用[^2] ``` #### 二、Java应用集成(使用java-saml库) 1. **添加依赖** ```xml <dependency> <groupId>com.onelogin</groupId> <artifactId>java-saml</artifactId> <version>2.9.0</version> </dependency> ``` 2. **SAML处理器类** ```java // 登录请求处理 public void samlLogin(HttpServletRequest request, HttpServletResponse response) { Auth auth = new Auth(request, response); auth.login(); // 重定向到Azure登录页[^3] } // SAML响应解析 public UserData processResponse(HttpServletRequest request, HttpServletResponse response) { Auth auth = new Auth(request, response); auth.processResponse(); // 验证签名 return new UserData( auth.getNameId(), // 用户唯一标识 auth.getNameIdFormat(), auth.getSessionIndex() ); } // 元数据生成 public String getMetadata() { return new Settings().getSPMetadata(); } ``` 3. **配置文件`saml.properties`** ```properties idp.entityid = https://sts.windows.net/<tenant-id>/ idp.single_sign_on_service.url = https://login.microsoftonline.com/<tenant-id>/saml2 idp.single_logout_service.url = https://login.microsoftonline.com/<tenant-id>/saml2 idp.certificate = AzureAD提供的公钥证书 ``` #### 三、核心流程说明 1. **登录流程** ```mermaid sequenceDiagram 用户->>+Java应用: 访问受限资源 Java应用->>+Azure AD: SAML AuthnRequest Azure AD-->>-用户: 返回登录页面 用户->>+Azure AD: 提交凭据 Azure AD->>+Java应用: SAML Response(POST到/saml/acs) Java应用-->>-用户: 建立本地会话 ``` 2. **关键配置验证点** - Azure中的**实体ID**需与Java应用的`sp.entityid`一致 - 确保SAML响应中的`Recipient`属性匹配ACS URL - 证书指纹需在Azure的*证书和密码*板块配置[^1] #### 四、调试建议 1. 使用[SAML Tracer](https://addons.mozilla.org/saml-tracer/)浏览器插件捕获SAML报文 2. 检查`Auth.getLastErrorReason()`获取详细错误信息 3. 验证时钟偏差:系统时间误差需在±5分钟内 > 完整示例代码参考:[onelogin/java-saml示例库](https://github.com/onelogin/java-saml)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值