在 FreeRADIUS C 模块中以编程方式将 VSA(供应商特定属性)添加到 Access-Accept 回复

Add a VSA (Vendor Specific Attribute) to Access-Accept reply programmatically in FreeRADIUS C module

我有一个 FreeRADIUS C 语言模块,它实现了 MOD_AUTHENTICATE 和 MOD_AUTHORIZE 方法用于自定义身份验证目的。我需要能够以编程方式将 VSA 添加到 Access-Accept 回复。

我尝试了一些 radius_pair_create() 和 fr_pair_add() 方法(见下面的代码片段),但这并没有对回复内容产生任何改变,可能是因为我指定了广告-特定于供应商的字典中不存在的临时值。还是因为我没有正确使用它们。

我的 FreeRADIUS 版本是 3_0_19

任何信息、指针,尤其是语法示例,我们将不胜感激。

void test_vsa(REQUEST *request)
{
    VALUE_PAIR *vp = NULL;

    vp = radius_pair_create(request->reply, NULL, 18, 0);

    if (vp)
    {
        log("Created VALUE_PAIR");
        vp->vp_integer = 96;
        fr_pair_add(&request->reply->vps, vp);
    } 
    else
    {
        log("Failed to create VALUE_PAIR");
    }
}

所以首先您将整数值写入字符串属性,这是错误的。服务器不进行 SEGVing 的唯一原因是因为 VP 的长度已保留为零,因此 RADIUS 编码器不会理会对中包含对值的 char * 的引用。

fr_pair_make 是这里更容易使用的函数,因为它将属性名称和值都作为字符串,因此您无需担心 C 类型。

下面的代码片段应该可以满足您的需求。

void test_avp(REQUEST *request)
{
    VALUE_PAIR *vp = NULL;

    vp = fr_pair_make(request->reply, &request->reply->vps, "Reply-Message", "Hello from FreeRADIUS", T_OP_SET);
    if (vp)
    {
        log("Created VALUE_PAIR");
    } 
    else
    {
        log("Failed to create VALUE_PAIR");
    }
}

为了获得更多解释,让我们看一下 doxygen header:

/** Create a VALUE_PAIR from ASCII strings
 *
 * Converts an attribute string identifier (with an optional tag qualifier)
 * and value string into a VALUE_PAIR.
 *
 * The string value is parsed according to the type of VALUE_PAIR being created.
 *
 * @param[in] ctx for talloc
 * @param[in] vps list where the attribute will be added (optional)
 * @param[in] attribute name.
 * @param[in] value attribute value (may be NULL if value will be set later).
 * @param[in] op to assign to new VALUE_PAIR.
 * @return a new VALUE_PAIR.
 */
VALUE_PAIR *fr_pair_make(TALLOC_CTX *ctx, VALUE_PAIR **vps,
            char const *attribute, char const *value, FR_TOKEN op)
  • ctx - 这是 vps 所属的数据包或请求。如果您向请求添加属性,它应该是 request->packet,回复应该是 request->reply,控制应该是 request.
  • vps - 如果指定,这将是将新 VP 插入的列表。如果这是 NULL fr_pair_make 将只是 return 对并让你将它插入到列表中。
  • attribute - 作为字符串的属性名称。
  • value - 作为字符串的属性值。对于 non-string 类型,fr_pair_make 将尝试执行转换。因此,例如,为整数类型传递“12345”,将导致整数值 12345 写入属性中的 int 字段。
  • op - 您通常需要我们 T_OP_SET,这意味着覆盖相同属性的现有实例。如果您想了解不同的运算符及其作用,请参阅 FR_TOKENT_OP_* 值和使用它们的代码。