2017-09-29 75 views
0

我使用TinyRadius将我的Java WebServer(作为Radius Client)认证到Windows Server(作为Radius Server)。Radius协议 - 如何将密码发送到服务器?

我成功地将用户访问请求发送到服务器并收到密码。

final RadiusClient client = new RadiusClient(
    new RadiusEndpoint(
     new InetSocketAddress(RADIUS_SERVER_ADDRESS, PORT), 
     SHARED_SECRET 
    ) 
); 

final AccessRequest request = new AccessRequest(
    USERNAME, 
    USER_PASS 
); 

request.setAuthProtocol(AccessRequest.AUTH_PAP); 
request.addAttribute("NAS-IP-Address", RADIUS_CLIENT_ADDRESS); 

RadiusPacket packet = null; 

try { 
    packet = client.authenticate(request); 
} catch (final RadiusException | IOException ex) { 
    System.out.println(ex.getMessage()); 
    ex.printStackTrace(); 
} 

此代码后面跟着一个日志,表明用户认证已被服务器批准。

Sep 29, 2017 10:05:32 AM org.tinyradius.util.RadiusClient authenticate 
INFO: send Access-Request packet: Access-Request, ID 1 
User-Name: mp 
NAS-IP-Address: 192.168.0.58 
Sep 29, 2017 10:05:33 AM org.tinyradius.util.RadiusClient authenticate 
INFO: received packet: Access-Challenge, ID 1 
State: 0x7b41324244344539362d453139332d344539392d413134322d4134423536364441443938437d 
Reply-Message: Enter PASSCODE 

我Windows服务器上的事件查看器也声明访问请求已被接受。

事实上,我正确地收到我的移动应用程序的密码(我使用Censornet的短信密码,altought这是无关紧要的)。

不幸的是,我无法找到任何TinyRadius密码例如在网络上,但同时浏览其他图书馆,我偶然发现了这个python library,其中指出:

的询问 - 例外messagesstate属性messages可以显示给用户以提示他们提供他们的 质询响应。必须作为RADIUS属性回显state

最后再利用替代密码的用户 质询响应认证。

所以我所做的就是使用上面的代码。我把PASSCODE,而不是USER_PASS,我将状态属性添加到我的AccessRequest。

final RadiusAttribute stateAttr = new RadiusAttribute(24, STATE.getBytes()); 
request.addAttribute(stateAttr); 

我发送请求到服务器,我可以看到这个日志。

Sep 29, 2017 10:34:04 AM org.tinyradius.util.RadiusClient authenticate 
INFO: send Access-Request packet: Access-Request, ID 1 
User-Name: mp 
NAS-IP-Address: 192.168.0.58 
State: 0x307837623431343133353330333433363334333832643433333433343339326433343432343633303264343234343335343532643330343533323337343633383332333333373332333933373764 
Sep 29, 2017 10:34:04 AM org.tinyradius.util.RadiusClient authenticate 
INFO: received packet: Access-Reject, ID 1 
Reply-Message: Session is unknown or has expired 

Windows事件查看器中指出:

Event description: 
    Event type:   Authentication request 
    Result:    Failure 
    Failure reason:  Password validation failed 

所以我读的RFC 2865访问挑战章的第4.4节,他们指出:

收到有效的 接入挑战表明一个新的接入请求应该是 发送 与用户密码属性替换为 用户的响应(加密),并包括来自访问挑战的状态属性 (如果有的话)。访问请求中只能存在0或1个状态属性实例。

因此,我正在做一切正确的,我猜。有人可以帮我吗?

回答

0

Okey,问题是我如何在我的第二个AccessRequest中设置状态

这并不工作:

final RadiusAttribute stateAttr = new RadiusAttribute(24, STATE.getBytes()); 
request.addAttribute(stateAttr); 

以下工作:

// this is the same code as written in the question 

// I send the authentication request to the server and he answers 
// with a Access-Challenge packet, which is saved in the variable 'packet' 
final AccessRequest request = new AccessRequest(
    USERNAME, 
    USER_PASS 
); 

// ... 

packet = client.authenticate(request); 

现在,我们已经收到密码后,我们创建了一个新的AccessRequest回答的挑战,并设置状态采取以下方式。

final AccessRequest challengeResponseRequest = new AccessRequest(
      USER, 
      PASSCODE 
); 

// here we set the state correctly 
// packet is the challengePacket recevied from the code above... 
challengeResponseRequest.addAttribute(new RadiusAttribute(24, packet.getAttribute(24).getAttributeData())); 
// finally... 
client.authenticate(challengeResponseRequest); 

,您会收到确认日志:

Sep 29, 2017 2:05:13 PM org.tinyradius.util.RadiusClient authenticate 
INFO: received packet: Access-Accept, ID 2 
Class: 0x8f8007ad0000013700010200c0a800050000000024db5d173578383201d3379907bd2a500000000000000098 
相关问题