2017-09-29 11 views
0

私はJava WebServer(Radius Clientとして)をWindows Server(Radius Serverとして)に認証するのにTinyRadiusを使用しています。Radius Protocol - サーバーにパスコードを送信する方法は?

ユーザーのアクセス要求をサーバーに正常に送信し、パスコードを戻しました。

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 Serverのイベントビューアーにも、アクセス要求が受け入れられたと記載されています。

実際に私はモバイルアプリケーションでパスコードを正しく受信しています(私はCensornetのSMSパスコードを使用していますが、これは無関係です)。

残念ながら、私は、ウェブ上の任意のTinyRadiusパスコードの例を見つけることができませんでしたが、他のライブラリをブラウズしながら、私はと述べており、このpython libraryつまずい:チャレンジ - レスポンス例外がmessagesstate属性を持っている

messagesユーザに チャレンジレスポンスを促すメッセージを表示することができます。 stateをRADIUS属性としてエコーバックする必要があります。

最後に、パスワードの代わりにユーザー からのチャレンジレスポンスを使用して再度認証します。

私がしたのは、上記の同じコードを使用することでした。 USER_PASSの代わりにPASSCODEを入れ、私のAccessRequestに状態属性を追加します。

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

私はこの要求をサーバーに送信し、このログを見ることができます。

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

は、だから私は、セクション4.4でRFC 2865アクセスチャレンジ章を読んで、そして、彼らはそれを述べる:

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イベントビューアは述べて

有効なの領収書 アクセス挑戦は、新しいアクセス要求が であることを示します。[...] ユーザパスワード属性を ユーザの応答(暗号化されている)、および存在する場合にはAccess-Challengeからの状態属性 を含む。アクセス要求には、状態属性のインスタンスが0または1つしか存在できません。

私はすべてのことを正しくやっています。誰でも私をここで助けてもらえますか

答えて

0

Okey、問題はです。私は2番目の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); 

、我々はパスコードを受け取った後、私たちは挑戦に答えるための新たなアクセス要求を作成している状態を設定次のようにします。

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 
関連する問題