Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Radius协议-如何在第二个请求中正确设置状态?_Java_Windows Server 2012_Radius_Tinyradius - Fatal编程技术网

Java Radius协议-如何在第二个请求中正确设置状态?

Java Radius协议-如何在第二个请求中正确设置状态?,java,windows-server-2012,radius,tinyradius,Java,Windows Server 2012,Radius,Tinyradius,我使用将Java Web服务器作为Radius客户端验证为Windows服务器作为Radius服务器 我成功地向服务器发送了用户访问请求,并收到了返回的密码 final RadiusClient client = new RadiusClient( new RadiusEndpoint( new InetSocketAddress(RADIUS_SERVER_ADDRESS, PORT), SHARED_SECRET ) ); final Acc

我使用将Java Web服务器作为Radius客户端验证为Windows服务器作为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提供的SMS密码,尽管这与此无关

不幸的是,我在web上找不到TinyRadius密码示例,但在浏览其他库时,我偶然发现了以下内容:

ChallengeResponse异常包含消息和状态属性消息,可以向用户显示这些消息,以提示他们进行响应 挑战回应。状态必须作为半径属性回显

最后,使用来自用户的质询响应再次进行身份验证 代替密码

所以我所做的就是使用上面相同的代码。我将PASSCODE而不是USER_PASS放入,并将state属性添加到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
因此,我阅读了第4.4节的RFC 2865访问挑战章节,他们指出:

有效发票的收据 Access Challenge(访问质询)表示应提交新的访问请求 发送[……] 将用户密码属性替换为 用户的响应已加密,并包含State属性 来自访问质询(如果有)。只有0或1个 状态属性可以存在于访问请求中


因此,我想我做的每件事都是对的。有人能帮我吗?

在我如何向服务器发送第二个请求方面存在一些问题

以这种方式执行此操作无法作为状态。getBytes返回一个不同编码的字符串:

我必须做的是:首先将响应存储到一个新包中

然后,创建一个新的AccessRequest来回答质询,并按以下方式设置状态

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

challengeResponseRequest.addAttribute(
    new RadiusAttribute(24, packet.getAttribute(24).getAttributeData()) // GOOD
);
注:24号为

通过发送较新的AccessRequest:

日志确认身份验证成功:

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

在如何向服务器发送第二个请求方面存在一些问题

以这种方式执行此操作无法作为状态。getBytes返回一个不同编码的字符串:

我必须做的是:首先将响应存储到一个新包中

然后,创建一个新的AccessRequest来回答质询,并按以下方式设置状态

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

challengeResponseRequest.addAttribute(
    new RadiusAttribute(24, packet.getAttribute(24).getAttributeData()) // GOOD
);
注:24号为

通过发送较新的AccessRequest:

日志确认身份验证成功:

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

谢谢你回答你自己的问题-我希望更多的人在自己找到答案的时候会这样做!谢谢你回答你自己的问题-我希望更多的人在自己找到答案的时候会这样做!
Sep 29, 2017 2:05:13 PM org.tinyradius.util.RadiusClient authenticate
INFO: received packet: Access-Accept, ID 2
Class: 0x8f8007ad0000013700010200c0a800050000000024db5d173578383201d3379907bd2a500000000000000098