PHP教程

PHP身份认证服务

PHP身份认证服务可以使用Radius软件包来实现。该软件包基于FreeBSD的libradius,允许客户端通过向远程服务器发出网络请求来执行身份验证和记账。同时,PECL扩展为Radius身份验证(RFC 2865)和Radius会计(RFC 2866)提供了全面支持。该软件包适用于Unix系统,已经在FreeBSD和Linux上进行了测试,同时也支持Windows操作系统。

一、预定义常量

1、RADIUS选项

有几个 RADIUS 函数接受选项标志作为位掩码,下面列出了代表这些标志的常量:

  • RADIUS_OPTION_SALT (int):设置该选项后,属性值将被盐加密;
  • RADIUS_OPTION_TAGGED (int):设置该选项后,属性值将被标记为标签参数的值。

2、RADIUS数据包类型

  • RADIUS 数据包(无论是请求还是响应)始终包含一种类型。这些 提供常量是为了在使用radius_create_request() 和比较 radius_send_request() 的结果时更容易指定类型;
  • RADIUS_ACCESS_REQUEST (int):访问请求,用于针对 RADIUS 服务器对用户进行身份验证。 访问请求数据包必须包含RADIUS_NAS_IP_ADDRESS或RADIUS_NAS_IDENTIFIER属性,还必须包含RADIUS_USER_PASSWORD、RADIUS_CHAP_PASSWORD或RADIUS_STATE属性,并且应包含RADIUS_USER_NAME属性;
  • RADIUS_ACCESS_ACCEPT (int):对 Access-Request 的 Access-Accept 响应,指示 RADIUS 服务器已成功对用户进行身份验证;
  • RADIUS_ACCESS_REJECT (int):对 Access-Request 的 Access-Reject 响应,指示 RADIUS 服务器无法对用户进行身份验证;
  • RADIUS_ACCESS_CHALLENGE (int):对 Access-Request 的 Access-Challenge 响应,指示 RADIUS 服务器需要在另一个访问请求中提供更多信息 在对用户进行身份验证之前;
  • RADIUS_ACCOUNTING_REQUEST (int):会计请求,用于传达会计信息 服务到 RADIUS 服务器;
  • RADIUS_ACCOUNTING_RESPONSE (int):对 Accounting-Request 的 Accounting-Response 响应;
  • RADIUS_COA_REQUEST (int):CoA 请求,从 RADIUS 服务器发送,以指示 用户会话中的授权已更改。响应必须是 以 CoA-ACK 或 CoA-NAK 的形式发送。此常量在 PECL radius 1.3.0 及更高版本中可用;
  • RADIUS_COA_ACK (int):发送到 RADIUS 服务器的 CoA-ACK,以指示用户 授权已更新。此常量在 PECL radius 1.3.0 及更高版本中可用;
  • RADIUS_COA_NAK (int):发送到 RADIUS 服务器以指示用户的 CoA-NAK 无法更新授权。此常量在 PECL radius 1.3.0 及更高版本中可用;
  • RADIUS_DISCONNECT_REQUEST (int):从 RADIUS 服务器发送的 Disconnect-Request,用于指示 必须终止用户会话。此常量在 PECL radius 1.3.0 及更高版本中可用;
  • RADIUS_DISCONNECT_ACK (int):Disconnect-ACK,发送到 RADIUS 服务器以指示用户 会话已终止。此常量在 PECL radius 1.3.0 及更高版本中可用;
  • RADIUS_DISCONNECT_NAK (int):发送到 RADIUS 服务器的 Disconnect-NAK,以指示用户 会话无法终止。此常量在 PECL radius 1.3.0 及更高版本中可用。

3、RADIUS属性类型

  • 这些常量定义可与 radius_put_addr()、radius_put_attr()、radius_put_int() 和 radius_put_string() 一起使用的 RADIUS 属性类型;
  • RADIUS_USER_NAME (int):User-Name 属性。属性值应为包含要进行身份验证的用户的名称的字符串, 并且可以使用 radius_put_attr() 进行设置;
  • RADIUS_USER_PASSWORD (int):User-Password 属性。属性值应为包含用户密码的字符串,可以使用 radius_put_attr() 进行设置;
  • RADIUS_CHAP_PASSWORD (int):Chap-Password 属性。属性值应为第一个字节包含 CHAP 标识符的字符串, 以及随后的 16 个字节,其中包含 CHAP 的 MD5 哈希值 identifier、明文密码和 CHAP 质询值 连接在一起。请注意,CHAP 质询值也应为 在 RADIUS_CHAP_CHALLENGE 属性中单独发送;

示例:Using CHAP passwords

<?php
// Firstly, we'll create an authentication handle and request.
$radh = radius_auth_open();
radius_add_server($radh, $server, $port, $secret, 3, 3);
radius_create_request($radh, RADIUS_ACCESS_REQUEST);

// Assuming $password contains the plaintext password, we now:

// Generate a challenge.
$challenge = mt_rand();

// Specify a CHAP identifier.
$ident = 1;

// Add the Chap-Password attribute.
$cp = md5(pack('Ca*', $ident, $password.$challenge), true);
radius_put_attr($radh, RADIUS_CHAP_PASSWORD, pack('C', $ident).$cp);

// Add the Chap-Challenge attribute.
radius_put_attr($radh, RADIUS_CHAP_CHALLENGE, $challenge);

/* From here, you would add the remaining attributes and
 * call radius_send_request(). */
?>
  • RADIUS_NAS_IP_ADDRESS (int):NAS-IP-Address 属性。属性值应为 IP 编码为 int 的 RADIUS 客户端的地址,其中 可以使用 radius_put_addr() 进行设置;
  • RADIUS_NAS_PORT (int):NAS-Port 属性。属性值应为 用户在 RADIUS 客户端上的物理端口编码为 int,可以使用 radius_put_int() 进行设置;
  • RADIUS_SERVICE_TYPE (int):Service-Type 属性。属性值指示服务 键入用户请求的类型,并且应为 int,可以使用 radius_put_int() 进行设置;

提供了许多常量来表示 此属性。它们包括:

  1. RADIUS_LOGIN
  2. RADIUS_FRAMED
  3. RADIUS_CALLBACK_LOGIN
  4. RADIUS_CALLBACK_FRAMED
  5. RADIUS_OUTBOUND
  6. RADIUS_ADMINISTRATIVE
  7. RADIUS_NAS_PROMPT
  8. RADIUS_AUTHENTICATE_ONLY
  9. RADIUS_CALLBACK_NAS_PROMPT
  • RADIUS_FRAMED_PROTOCOL (int):Framed-Protocol 属性。属性值应为 int,指示要用于 framed 的帧 access,并且可以使用 radius_put_int() 进行设置。这 可能的属性值包括以下常量:
  1. RADIUS_PPP
  2. RADIUS_SLIP
  3. RADIUS_ARAP
  4. RADIUS_GANDALF
  5. RADIUS_XYLOGICS
  • RADIUS_FRAMED_IP_ADDRESS (int):Framed-IP-Address 属性。属性值应为 编码为 int 的用户网络地址, 可以使用 radius_put_addr() 和 使用 radius_cvt_addr() 检索;
  • RADIUS_FRAMED_IP_NETMASK (int):Framed-IP-Netmask 属性。属性值应为 编码为 int 的用户网络的网络掩码, 可以使用 radius_put_addr() 和 使用 radius_cvt_addr() 检索;
  • RADIUS_FRAMED_ROUTING (int):Framed-Routing 属性。属性值应为指示用户的路由方法的 int,该 可以使用 radius_put_int() 进行设置。

可能的值包括:

  1. 0:无路由
  2. 1:发送路由数据包
  3. 2:侦听路由数据包
  4. 3:发送和收听
  • RADIUS_FILTER_ID (int):Filter-ID 属性。属性值应为 特定于实现的、人类可读的过滤器字符串, 可以使用 radius_put_attr() 进行设置;
  • RADIUS_FRAMED_MTU (int):Framed-MTU 属性。属性值应为 int,指示要为用户配置的 MTU, 并且可以使用 radius_put_int() 进行设置;
  • RADIUS_FRAMED_COMPRESSION (int):Framed-Compression 属性。属性值应为 一个 int 表示要使用的压缩协议, 并且可以使用 radius_put_int() 进行设置。可能 值包括以下常量:
  1. RADIUS_COMP_NONE:无压缩
  2. RADIUS_COMP_VJ:VJ TCP/IP 报头压缩
  3. RADIUS_COMP_IPXHDR:IPX 标头压缩
  4. RADIUS_COMP_STAC_LZS: Stac-LZS 压缩(在 PECL 半径 1.3.0b2 中添加)
  • RADIUS_LOGIN_IP_HOST (int):Login-IP-Host 属性。属性值应为 IP 将用户连接到的地址,编码为 int, 可以使用 radius_put_addr() 进行设置;
  • RADIUS_LOGIN_SERVICE (int):Login-Service 属性。属性值是一个 int,指示要将用户连接到的服务 on 登录主机。该值可以通过 radius_cvt_int() 转换为 PHP 整数;
  • RADIUS_LOGIN_TCP_PORT (int):Login-TCP-Port 属性。属性值是一个 int,指示要将用户连接到的端口 登录主机。该值可以通过 radius_cvt_int() 转换为 PHP 整数;
  • RADIUS_REPLY_MESSAGE (int):Reply-Message 属性。属性值是一个字符串,其中包含可在 对访问请求的响应;
  • RADIUS_CALLBACK_NUMBER (int):Callback-Number 属性。属性值是一个字符串,其中包含要用于回调的拨号字符串;
  • RADIUS_CALLBACK_ID (int):Callback-Id 属性。属性值是一个字符串,其中包含要调用的位置的特定于实现的名称;
  • RADIUS_FRAMED_ROUTE (int):Framed-Route 属性。属性值是一个字符串,其中包含要为其配置的一组特定于实现的路由 用户;
  • RADIUS_FRAMED_IPX_NETWORK (int):Framed-IPX-Network 属性。属性值是一个 int,其中包含要为 user,或指示 RADIUS 客户端应选择网络,并可通过 radius_cvt_int() 访问;
  • RADIUS_STATE (int):State 属性。属性值是来自服务器的 Access-Challenge 中包含的实现定义的字符串,该字符串 必须包含在后续的访问请求中,并且可以使用 radius_put_attr() 进行设置;
  • RADIUS_CLASS (int):Class 属性。属性值是包含在 Access-Accept 消息中的任意字符串,该字符串应 然后在 Accounting-Request 消息中发送到记帐服务器, 并且可以使用 radius_put_attr() 进行设置;
  • RADIUS_VENDOR_SPECIFIC (int):特定于供应商的属性。通常,供应商属性值 应使用 radius_put_vendor_addr()、radius_put_vendor_attr()、radius_put_vendor_int() 和 radius_put_vendor_string() 进行设置,而不是直接设置;此常量在解释特定于供应商时最有用 来自 RADIUS 服务器的响应中的属性;当供应商特定时 属性,则应使用 radius_get_vendor_attr() 函数来访问供应商 ID、属性类型和 属性值。
  • RADIUS_SESSION_TIMEOUT (int):会话超时;
  • RADIUS_IDLE_TIMEOUT (int):空闲超时;
  • RADIUS_TERMINATION_ACTION (int):终止操作;
  • RADIUS_CALLED_STATION_ID (int):被叫站 ID;
  • RADIUS_CALLING_STATION_ID (int):呼叫站 ID;
  • RADIUS_NAS_IDENTIFIER (int):NAS ID;
  • RADIUS_PROXY_STATE (int):代理状态;
  • RADIUS_LOGIN_LAT_SERVICE (int):登录LAT服务;
  • RADIUS_LOGIN_LAT_NODE (int):登录 LAT 节点;
  • RADIUS_LOGIN_LAT_GROUP (int):登录 LAT 组;
  • RADIUS_FRAMED_APPLETALK_LINK (int):带框的 Appletalk 链接;
  • RADIUS_FRAMED_APPLETALK_NETWORK (int):框架 Appletalk 网络;
  • RADIUS_FRAMED_APPLETALK_ZONE (int):带框的Appletalk专区;
  • RADIUS_CHAP_CHALLENGE (int):挑战;
  • RADIUS_NAS_PORT_TYPE (int):NAS端口类型,其中一种:
  1. RADIUS_ASYNC
  2. RADIUS_SYNC
  3. RADIUS_ISDN_SYNC
  4. RADIUS_ISDN_ASYNC_V120
  5. RADIUS_ISDN_ASYNC_V110
  6. RADIUS_VIRTUAL
  7. RADIUS_PIAFS
  8. RADIUS_HDLC_CLEAR_CHANNEL
  9. RADIUS_X_25
  10. RADIUS_X_75
  11. RADIUS_G_3_FAX
  12. RADIUS_SDSL
  13. RADIUS_ADSL_CAP
  14. RADIUS_ADSL_DMT
  15. RADIUS_IDSL
  16. RADIUS_ETHERNET
  17. RADIUS_XDSL
  18. RADIUS_CABLE
  19. RADIUS_WIRELESS_OTHER
  20. RADIUS_WIRELESS_IEEE_802_11
  • RADIUS_PORT_LIMIT (int):端口限制;
  • RADIUS_LOGIN_LAT_PORT (int):登录LAT端口;
  • RADIUS_CONNECT_INFO (int):连接信息;
  • RADIUS_ACCT_STATUS_TYPE (int):会计状态类型,以下之一:
  1. RADIUS_START
  2. RADIUS_STOP
  3. RADIUS_ACCOUNTING_ON
  4. RADIUS_ACCOUNTING_OFF
  • RADIUS_ACCT_DELAY_TIME (int):记帐延迟时间;
  • RADIUS_ACCT_INPUT_OCTETS (int):记帐输入字节数;
  • RADIUS_ACCT_OUTPUT_OCTETS (int):记帐输出字节数;
  • RADIUS_ACCT_SESSION_ID (int):记帐会话 ID;
  • RADIUS_ACCT_AUTHENTIC (int):会计正宗,以下之一:
  1. RADIUS_AUTH_RADIUS
  2. RADIUS_AUTH_LOCAL
  3. RADIUS_AUTH_REMOTE
  • RADIUS_ACCT_SESSION_TIME (int):会计会话时间;
  • RADIUS_ACCT_INPUT_PACKETS (int):记帐输入数据包;
  • RADIUS_ACCT_OUTPUT_PACKETS (int):记帐输出数据包;
  • RADIUS_ACCT_TERMINATE_CAUSE (int):会计终止原因之一:
  1. RADIUS_TERM_USER_REQUEST
  2. RADIUS_TERM_LOST_CARRIER
  3. RADIUS_TERM_LOST_SERVICE
  4. RADIUS_TERM_IDLE_TIMEOUT
  5. RADIUS_TERM_SESSION_TIMEOUT
  6. RADIUS_TERM_ADMIN_RESET
  7. RADIUS_TERM_ADMIN_REBOOT
  8. RADIUS_TERM_PORT_ERROR
  9. RADIUS_TERM_NAS_ERROR
  10. RADIUS_TERM_NAS_REQUEST
  11. RADIUS_TERM_NAS_REBOOT
  12. RADIUS_TERM_PORT_UNNEEDED
  13. RADIUS_TERM_PORT_PREEMPTED
  14. RADIUS_TERM_PORT_SUSPENDED
  15. RADIUS_TERM_SERVICE_UNAVAILABLE
  16. RADIUS_TERM_CALLBACK
  17. RADIUS_TERM_USER_ERROR
  18. RADIUS_TERM_HOST_REQUEST
  • RADIUS_ACCT_MULTI_SESSION_ID (int):记帐多会话 ID;
  • RADIUS_ACCT_LINK_COUNT (int):记帐链接计数。

4、RADIUS供应商特定属性类型

RADIUS_VENDOR_MICROSOFT (整数):Microsoft 特定供应商属性 (» RFC 2548),以下属性之一。

  • RADIUS_MICROSOFT_MS_CHAP_RESPONSE
  • RADIUS_MICROSOFT_MS_CHAP_ERROR
  • RADIUS_MICROSOFT_MS_CHAP_PW_1
  • RADIUS_MICROSOFT_MS_CHAP_PW_2
  • RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW
  • RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW
  • RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY
  • RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES
  • RADIUS_MICROSOFT_MS_RAS_VENDOR
  • RADIUS_MICROSOFT_MS_CHAP_DOMAIN
  • RADIUS_MICROSOFT_MS_CHAP_CHALLENGE
  • RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS
  • RADIUS_MICROSOFT_MS_BAP_USAGE
  • RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD
  • RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT
  • RADIUS_MICROSOFT_MS_MPPE_SEND_KEY
  • RADIUS_MICROSOFT_MS_MPPE_RECV_KEY
  • RADIUS_MICROSOFT_MS_RAS_VERSION
  • RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD
  • RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD
  • RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON
  • RADIUS_MICROSOFT_MS_FILTER
  • RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE
  • RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE
  • RADIUS_MICROSOFT_MS_CHAP2_RESPONSE
  • RADIUS_MICROSOFT_MS_CHAP2_SUCCESS
  • RADIUS_MICROSOFT_MS_CHAP2_PW
  • RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER
  • RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER
  • RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER
  • RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER
  • RADIUS_MICROSOFT_MS_ARAP_CHALLENGE

二、Radius函数

Radius函数和对应含义如下:

  • radius_acct_open — 创建用于记帐的 Radius 句柄;
  • radius_add_server — 添加服务器;
  • radius_auth_open — 创建用于身份验证的 Radius 句柄;
  • radius_close — 释放所有资源;
  • radius_config — 使库读取给定的配置文件;
  • radius_create_request — 创建记帐或身份验证请求;
  • radius_cvt_addr — 将原始数据转换为IP地址;
  • radius_cvt_int — 将原始数据转换为整数;
  • radius_cvt_string — 将原始数据转换为字符串;
  • radius_demangle_mppe_key — 从损坏的数据中派生 mppe 密钥;
  • radius_demangle — 去解数据;
  • radius_get_attr — 提取属性;
  • radius_get_tagged_attr_data — 从标记属性中提取数据;
  • radius_get_tagged_attr_tag — 从标记属性中提取标签;
  • radius_get_vendor_attr — 提取供应商特定属性;
  • radius_put_addr — 附加IP地址属性;
  • radius_put_attr — 附加二进制属性;
  • radius_put_int — 附加整数属性;
  • radius_put_string — 附加字符串属性;
  • radius_put_vendor_addr — 附加特定于供应商的 IP 地址属性;
  • radius_put_vendor_attr — 附加特定于供应商的二进制属性;
  • radius_put_vendor_int — 附加特定于供应商的整数属性;
  • radius_put_vendor_string — 附加特定于供应商的字符串属性;
  • radius_request_authenticator — 返回请求身份验证器;
  • radius_salt_encrypt_attr — 对值进行盐加密;
  • radius_send_request — 发送请求并等待回复;
  • radius_server_secret — 返回共享密钥;
  • radius_strerror — 返回错误消息。

三、使用Radius软件包

要开始使用Radius软件包进行身份认证,可以按照以下步骤操作:

1、获取RADIUS资源:首先需要获取一个RADIUS服务器的资源,可以通过购买或租用RADIUS服务器来实现。

2、配置库:在PHP中,需要安装并配置好Radius软件包的库文件。

3、创建请求:创建一个Radius请求对象,用于向RADIUS服务器发送身份验证请求。

4、put属性:将需要验证的属性(如用户名和密码)添加到请求对象中。

5、发送请求:通过Radius客户端向RADIUS服务器发送请求。

6、接收属性:从RADIUS服务器接收响应,并解析其中的验证结果。

7、关闭RADIUS资源(可选):完成身份验证后,可以选择关闭与RADIUS服务器的连接。

此外,该软件包还包含一个示例php脚本,演示了如何使用PAP或CHAP(md5)进行身份验证。如果使用Microsoft Radius服务器,则无法使用CHAP(md5)。如果要使用MS-CHAPv1或MS-CHAPv2进行身份验证,需要安装mcrypt和MHASH扩展。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录