นโยบาย LDAP

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

อะไร

นโยบาย LDAP มีฟังก์ชันต่อไปนี้

  • การตรวจสอบสิทธิ์: ระบบจะตรวจสอบข้อมูลเข้าสู่ระบบของผู้ใช้ที่ระบุในคำขอเทียบกับข้อมูลเข้าสู่ระบบในผู้ให้บริการ LDAP นโยบาย LDAP มีความยืดหยุ่นสูงกับ การตรวจสอบสิทธิ์ โดยให้คุณใช้ค่า DN ใดก็ได้พร้อมกับรหัสผ่าน แม้ว่าค่า DN ที่ต้องการจะไม่ได้อยู่ในคำขอ ตัวอย่างเช่น สมมติว่าคุณต้องใช้อีเมล / รหัสผ่านในการตรวจสอบสิทธิ์ คุณสามารถเลือกตัวเลือกต่อไปนี้ได้
    • หากอีเมลอยู่ในคำขอ คุณก็สามารถใช้อีเมลนั้นกับรหัสผ่านเพื่อตรวจสอบสิทธิ์ LDAP ได้เลย
    • หากอีเมลไม่ได้อยู่ในคำขอ แต่แอตทริบิวต์ DN อื่นอยู่ในคำขอ (เช่น หมายเลขโทรศัพท์) คุณสามารถใช้หมายเลขโทรศัพท์เพื่อรับอีเมลที่เกี่ยวข้องจาก LDAP แล้วใช้อีเมล/ รหัสผ่านเพื่อตรวจสอบสิทธิ์
  • การค้นหาชื่อเฉพาะ (DN): นอกจากการตรวจสอบสิทธิ์แล้ว คุณยัง ใช้นโยบาย LDAP เพื่อระบุแอตทริบิวต์ของผู้ใช้ในคำขอ เช่น อีเมล และ ทำการค้นหาเพื่อดึงแอตทริบิวต์ DN อื่นๆ จาก LDAP สำหรับผู้ใช้รายนั้นได้ด้วย ระบบจะจัดเก็บ DN ที่ดึงมาไว้ในตัวแปร

ใช้นโยบาย LDAP เมื่อต้องการจำกัดการเข้าถึงทรัพยากรที่ได้รับการปกป้องไว้สำหรับผู้ใช้ในผู้ให้บริการ LDAP เช่น ผู้ใช้ที่เป็นผู้ดูแลระบบ ผู้ใช้ในองค์กร และนักพัฒนาแอป โดยเฉพาะอย่างยิ่งเมื่อ การเข้าถึงโทเค็น OAuth ไม่จำเป็นหรือมีขนาดใหญ่เกินไป นโยบายนี้ยังออกแบบมาเพื่อ ดึงข้อมูลเมตาของชื่อโดเมนเพื่อใช้ในโฟลว์พร็อกซี API

ตัวอย่างเช่น คุณสามารถกำหนดให้การเรียก API ทำงานได้ก็ต่อเมื่อผู้ใช้ได้รับการตรวจสอบสิทธิ์สำเร็จ กับ LDAP แล้ว จากนั้นเลือกดึงแอตทริบิวต์ DN (ชื่อโดเมน) สำหรับผู้ใช้หลังจาก ตรวจสอบสิทธิ์สำเร็จ

ดูข้อมูลเพิ่มเติมได้ที่

ตัวอย่าง

การตรวจสอบสิทธิ์ด้วยชื่อผู้ใช้/รหัสผ่าน

<Ldap name="4GLdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <UserName ref="request.header.username"/>
       <Password ref="request.header.password"/>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

ตัวอย่างนี้แสดงการตรวจสอบสิทธิ์กับผู้ให้บริการ LDAP นโยบายจะส่งชื่อผู้ใช้ และรหัสผ่านจากคำขอไปยัง LDAP เพื่อตรวจสอบสิทธิ์

การตรวจสอบสิทธิ์แอตทริบิวต์ DN

<Ldap name="LdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <Password ref="request.header.password"/>
       <SearchQuery>mail={request.header.mail}</SearchQuery>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

นโยบายนี้จะรับ DN ของผู้ใช้ด้วยอีเมลในส่วนหัวของคำขอ จากนั้น ตรวจสอบสิทธิ์ผู้ใช้กับ LDAP ด้วยรหัสผ่านที่ระบุในส่วนหัวของคำขอ

การค้นหา LDAP

<Ldap name="LdapPolicy">
    <!-- using a custom LDAP provider -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
    <LdapResource>MyLdap</LdapResource>
    <Search>
        <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
        <SearchQuery>mail={request.header.mail}</SearchQuery>
        <Attributes>
            <Attribute>address</Attribute>
            <Attribute>phone</Attribute>
            <Attribute>title</Attribute>
        </Attributes>
        <Scope></Scope> <!-- default is subtree -->
    </Search>
</Ldap>

นโยบายนี้อ้างอิงผู้ให้บริการ LDAP ที่กำหนดเอง โดยใช้อีเมลในส่วนหัวของคำขอ เพื่อระบุผู้ใช้ จากนั้นดึงที่อยู่ โทรศัพท์ และตำแหน่งของผู้ใช้จาก LDAP ระบบจะจัดเก็บแอตทริบิวต์ DN ที่ดึงมาไว้ในตัวแปร ดู "ตัวแปรเฉพาะนโยบาย"

หากต้องการค้นหา LDAP และดึงแอตทริบิวต์ DN คำขอต้องมีข้อมูลเข้าสู่ระบบของผู้ดูแลระบบ

ข้อมูลอ้างอิงองค์ประกอบ

ต่อไปนี้เป็นคำอธิบายขององค์ประกอบและแอตทริบิวต์ของนโยบาย LDAP

องค์ประกอบ

คำอธิบาย

Ldap

องค์ประกอบระดับบนสุดที่มีแอตทริบิวต์ name ให้คุณป้อนชื่อนโยบาย

LdapConnectorClass

เมื่อใช้นโยบาย LDAP กับผู้ให้บริการ LDAP ที่กำหนดเอง custom LDAP provider (ไม่ได้มาจาก Apigee) ให้ระบุคลาสตัวเชื่อมต่อ LDAP ที่มีคุณสมบัติครบถ้วน ซึ่งเป็นคลาสที่คุณใช้เพื่อติดตั้งใช้งานอินเทอร์เฟซ ExternalLdapConProvider ของ Apigee

LdapResource

ป้อนชื่อสภาพแวดล้อมของทรัพยากร LDAP ดูข้อมูลเพิ่มเติมได้ที่สร้าง ทรัพยากร LDAP

BaseDN

ระดับฐานของ LDAP ที่ข้อมูลทั้งหมดของคุณอยู่ เช่น ใน ผู้ให้บริการ LDAP ของ Apigee ข้อมูลทั้งหมดจะอยู่ภายใต้ dc=apigee,dc=com

  • ref: ใช้เพื่อระบุตัวแปรโฟลว์ที่มีค่า BaseDN เช่น apigee.baseDN ref จะมีความสำคัญเหนือกว่าค่า BaseDN ที่ชัดเจน หากคุณระบุ ทั้ง ref และ value ref จะมีความสำคัญเหนือกว่า หาก ref ไม่สามารถแก้ไขได้ใน รันไทม์ ระบบจะใช้ value

Scope

  • object: การตรวจสอบสิทธิ์หรือการค้นหาจะเกิดขึ้นที่ระดับฐานของ LDAP เท่านั้น
  • onelevel: การตรวจสอบสิทธิ์หรือการค้นหาจะเกิดขึ้นที่ระดับต่ำกว่าระดับฐาน 1 ระดับ
  • subtree (ค่าเริ่มต้น): การตรวจสอบสิทธิ์หรือการค้นหาจะเกิดขึ้นที่ระดับฐาน และแบบเรียกซ้ำทั้งหมดที่อยู่ต่ำกว่าระดับฐาน

การตรวจสอบสิทธิ์

Authentication

องค์ประกอบระดับบนสุดสำหรับลักษณะการทำงานของการตรวจสอบสิทธิ์ที่คุณติดตั้งใช้งาน

UserName

องค์ประกอบว่างที่ใช้แอตทริบิวต์ใดแอตทริบิวต์หนึ่งต่อไปนี้

  • ref: การอ้างอิงชื่อผู้ใช้ในคำขอ เช่น request.header.username
  • value: ชื่อผู้ใช้เอง

หากไม่ได้ตรวจสอบสิทธิ์ด้วยชื่อผู้ใช้ หรือหากชื่อผู้ใช้ไม่ได้รวมอยู่ใน คำขอ คุณไม่จำเป็นต้องรวมองค์ประกอบนี้

หากชื่อผู้ใช้อยู่ในคำขอ แต่คุณต้องการตรวจสอบสิทธิ์ผู้ใช้ด้วยแอตทริบิวต์ DN อื่นที่ไม่ใช่ชื่อผู้ใช้ เช่น อีเมล ให้รวม SearchQuery เพื่อรับอีเมลของผู้ใช้ที่เชื่อมโยงกับรหัสผ่าน นโยบาย LDAP จะใช้ชื่อผู้ใช้เพื่อค้นหาผู้ให้บริการ LDAP สำหรับอีเมลที่เกี่ยวข้อง ซึ่งจะใช้ในการตรวจสอบสิทธิ์

Password

องค์ประกอบว่างที่ใช้แอตทริบิวต์ใดแอตทริบิวต์หนึ่งต่อไปนี้

  • ref: การอ้างอิงรหัสผ่านในคำขอ เช่น request.header.password
  • value: รหัสผ่านที่เข้ารหัสแล้ว

SearchQuery

หากต้องการตรวจสอบสิทธิ์โดยใช้แอตทริบิวต์ DN อื่นที่ไม่ใช่ชื่อผู้ใช้ เช่น อีเมล กำหนดค่านโยบาย LDAP เพื่อรับแอตทริบิวต์ DN จากคำขอ (เช่น ชื่อผู้ใช้) ซึ่งจะใช้เพื่อระบุผู้ใช้ใน LDAP ดึงอีเมล และตรวจสอบสิทธิ์ ผู้ใช้

ตัวอย่างเช่น สมมติว่า LDAP กำหนดแอตทริบิวต์ "mail" สำหรับจัดเก็บอีเมล ให้ใช้ `<SearchQuery>mail={request.header.mail}</SearchQuery>`

<SearchQuery>mail={request.header.mail}</SearchQuery>

ค้นหา

Search

องค์ประกอบระดับบนสุดสำหรับพฤติกรรมการค้นหาที่คุณติดตั้งใช้งาน

SearchQuery

การระบุผู้ใช้ด้วยข้อมูลเมตาในคำขอหรือการตอบกลับจะช่วยให้คุณใช้ องค์ประกอบนี้เพื่อดึงแอตทริบิวต์ DN เพิ่มเติมสำหรับผู้ใช้จาก LDAP ได้ ตัวอย่างเช่น หากคำขอมีอีเมลของผู้ใช้ และ LDAP กำหนดแอตทริบิวต์ mail สำหรับจัดเก็บอีเมลของผู้ใช้ คุณจะต้องใช้การตั้งค่าต่อไปนี้

<SearchQuery>mail={request.header.mail}</SearchQuery>

การค้นหานี้จะค้นหา LDAP สำหรับอีเมลที่ตรงกับอีเมลในคำขอ และตอนนี้ นโยบายสามารถดึงแอตทริบิวต์ DN เพิ่มเติมสำหรับผู้ใช้รายนั้นด้วยองค์ประกอบ Attributes

Attributes

ใช้องค์ประกอบ <Attribute> อย่างน้อย 1 รายการเพื่อ ระบุข้อมูลเมตา DN ที่ต้องการดึงสำหรับผู้ใช้ ต้องระบุแอตทริบิวต์อย่างน้อย 1 รายการ

ตัวอย่างเช่น หลังจาก SearchQuery ระบุผู้ใช้แล้ว ตอนนี้นโยบายสามารถดึงแอตทริบิวต์ DN สำหรับผู้ใช้ เช่น ที่อยู่ หมายเลขโทรศัพท์ และตำแหน่งของผู้ใช้ ดังที่แสดงในตัวอย่างต่อไปนี้

ค่าแอตทริบิวต์คือชื่อแอตทริบิวต์ DN ที่กำหนดไว้ใน LDAP

<Attributes>
  <Attribute>address</Attribute>
  <Attribute>phone</Attribute>
  <Attribute>title</Attribute>
</Attributes>

หมายเหตุการใช้งาน

Apigee Edge for Private Cloud ช่วยให้คุณใช้ประโยชน์จากผู้ให้บริการ LDAP ในการเรียก API ได้ นโยบาย LDAP ช่วยให้แอปพลิเคชันตรวจสอบสิทธิ์ข้อมูลเข้าสู่ระบบกับผู้ใช้ที่จัดเก็บไว้ใน LDAP ได้ และคุณสามารถ ดึงชื่อเฉพาะ (DN) จาก LDAP ซึ่งเป็นข้อมูลเมตาหรือแอตทริบิวต์ที่เชื่อมโยงกับ ผู้ใช้แต่ละราย เช่น อีเมล ที่อยู่ และหมายเลขโทรศัพท์ ระบบจะจัดเก็บ DN ที่แสดงผลไว้ในตัวแปรเพื่อให้ พร็อกซี API ใช้งานต่อไป

สร้างทรัพยากร LDAP

นโยบาย LDAP ใช้ประโยชน์จากทรัพยากร LDAP ที่คุณสร้างใน Apigee Edge ทรัพยากร LDAP จะให้ข้อมูลการเชื่อมต่อกับที่เก็บ LDAP

หากต้องการสร้างและจัดการทรัพยากร LDAP ให้ใช้ API และเพย์โหลดต่อไปนี้

API

สร้าง (POST) ทรัพยากร LDAP หรือแสดงรายการ (GET) ทรัพยากร LDAP ทั้งหมด

/v1/organizations/org_name/environments/environment/ldapresources

รับรายละเอียด (GET), อัปเดต (POST) และลบ (DELETE) ทรัพยากร LDAP

/v1/organizations/org_name/environments/environment/ldapresources/ldap_resource_name

เพย์โหลด

ต่อไปนี้เป็นเพย์โหลด XML ตัวอย่างพร้อมความคิดเห็นเกี่ยวกับการใช้งาน

<LdapResource name="ldap1">
  <Connection>
    <Hosts>
      <!-- port is optional: defaults to 389 for ldap:// and 636 for ldaps:// -->
      <Host port="636">foo.com</Host>
    </Hosts>
    <SSLEnabled>false</SSLEnabled> <!-- optional, defaults to false -->
    <Version>3</Version> <!-- optional, defaults to 3-->
    <Authentication>simple</Authentication> <!-- optional, only simple supported -->
    <ConnectionProvider>jndi|unboundid</ConnectionProvider> <!-- required -->
    <ServerSetType>single|round robin|failover</ServerSetType> <!-- not applicable for jndi -->
    <!-- If using a custom LDAP provider, the fully qualified class: -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
  </Connection>
  <ConnectPool enabled="true"> <!-- enabled is optional, defaults to true -->
    <Timeout>30000</Timeout> <!-- optional, in milliseconds; if not set, no timeout -->
    <Maxsize>50</Maxsize> <!-- optional; if not set, no max connections -->
    <Prefsize>30</Prefsize> <!-- optional; if not set, no pref size -->
    <Initsize></Initsize> <!-- optional; if not set, defaults to 1 -->
    <Protocol></Protocol> <!-- optional; if not set, defaults to 'ssl plain' -->
  </ConnectPool>
  <Admin>
    <DN>cn=manager,dc=apigee,dc=com</DN>
    <Password>secret</Password>
  </Admin>
</LdapResource>

ตัวอย่าง curl: สร้างทรัพยากร LDAP

ตัวอย่างต่อไปนี้สร้างทรัพยากร LDAP ชื่อ ldap1

curl -X POST -H "Content-Type: application/xml" \
  https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/ldapresources \
  -u apigee_email:password -d \
  '<LdapResource name="ldap1">
    <Connection>
      <Hosts>
      <Host>foo.com</Host>
      </Hosts>
      <SSLEnabled>false</SSLEnabled>
      <Version>3</Version>
      <Authentication>simple</Authentication>
      <ConnectionProvider>unboundid</ConnectionProvider>
      <ServerSetType>round robin</ServerSetType>
    </Connection>
    <ConnectPool enabled="true">
      <Timeout>30000</Timeout>
      <Maxsize>50</Maxsize>
      <Prefsize>30</Prefsize>
      <Initsize></Initsize>
      <Protocol></Protocol>
    </ConnectPool>
    <Admin>
      <DN>cn=manager,dc=apigee,dc=com</DN>
      <Password>secret</Password>
    </Admin>
  </LdapResource>'

โค้ดตอบกลับ

ต่อไปนี้เป็นโค้ดตอบกลับ HTML ที่นโยบายแสดงผลเมื่อสำเร็จหรือล้มเหลว

  • สำเร็จ: 200
  • ล้มเหลว: 401

การใช้ผู้ให้บริการ LDAP ที่กำหนดเองใน Edge for Private Cloud

การใช้ผู้ให้บริการ LDAP ที่กำหนดเอง

Apigee Edge for Private Cloud มาพร้อมกับผู้ให้บริการ LDAP ที่กำหนดค่าไว้แล้วเพื่อ โต้ตอบกับนโยบาย LDAP อย่างไรก็ตาม หากคุณใช้ผู้ให้บริการ LDAP ที่กำหนดเอง คุณต้องเปิดใช้ ผู้ให้บริการเพื่อให้รองรับนโยบาย LDAP โดยทำดังนี้

  1. ในคลาสผู้ให้บริการ LDAP ให้ติดตั้งใช้งานอินเทอร์เฟซ ExternalLdapConProvider
    public interface ExternalLdapConProvider {
      void doAuthentication(LdapBean LlapBean, String userDN, String password, String baseDN);
    
      void doSearchAndAuthentication(LdapBean LlapBean, String password, String baseDN, String query, int scope);
    
      Collection<Map<String, String[]>> doSearch(LdapBean LlapBean, String query,
        String baseDN, Collection<String> requiredAttributes, int scope);
    
      void closeConnections();
    }
  2. ใน <LdapConnectorClass> ของการกำหนดค่านโยบาย (ส่วนถัดไป) เพิ่มชื่อคลาสที่มีคุณสมบัติครบถ้วนของผู้ให้บริการ LDAP ที่กำหนดเอง
  3. ดาวน์โหลดไฟล์นี้: custom-ldap.jar_.zip (คุณอาจต้องคลิกขวาแล้วเลือกบันทึกเป็น)
  4. คลายซิปไฟล์
  5. เพิ่มไฟล์ custom-ldap.jar ลงในสภาพแวดล้อมและตรวจสอบว่าไฟล์อยู่ใน classpath
  6. สร้างทรัพยากรสภาพแวดล้อมสำหรับผู้ให้บริการ LDAP คุณจะใช้ชื่อทรัพยากรสภาพแวดล้อมในองค์ประกอบ <LdapResource> ของนโยบาย LDAP

การใช้ UnboundID LDAP SDK สำหรับ Java

คุณสามารถใช้ UnboundID LDAP SDK กับนโยบาย LDAP ได้ แต่ก่อนอื่นคุณต้องดาวน์โหลดเวอร์ชัน 2.3.1 แล้วเพิ่มลงใน classpath ของ Message Processor แต่ละรายการ

วิธีใช้ UnboundID LDAP SDK กับนโยบาย LDAP

  1. เปิดเบราว์เซอร์และไปที่ที่เก็บไฟล์ Sourceforge สำหรับ UnboundID LDAP SDK
    https://sourceforge.net/projects/ldap-sdk/files/
  2. ค้นหา SDK เวอร์ชัน 2.3.1 (SE หรือ Standard Edition) แล้วดาวน์โหลดไฟล์ ZIP สำหรับเวอร์ชันนั้น เช่น ดาวน์โหลด "unboundid-ldapsdk-2.3.1-se.zip"
  3. แยกไฟล์ JAR จากไฟล์ ZIP ของ SDK ดังที่แสดงในตัวอย่างต่อไปนี้
    unzip -j -d ~/tmp ~/Downloads/unboundid-ldapsdk-2.3.1-se.zip unboundid-ldapsdk-2.3.1-se/unboundid-ldapsdk-se.jar

    คำสั่งนี้จะแยกเฉพาะไฟล์ JAR ไปยังไดเรกทอรี ~/tmp โดยจะละเว้นโครงสร้างไดเรกทอรี ด้วย -jแม้ว่าจะเป็นตัวเลือกก็ตาม

  4. ในโหนด Message Processor แต่ละรายการ ให้ทำดังนี้
    1. คัดลอกไฟล์ JAR ไปยังไดเรกทอรี /opt/apigee/edge-gateway/lib/thirdparty ของ Message Processor
    2. หากจำเป็น ให้สิทธิ์ผู้ใช้ Apigee ในไฟล์ JAR เพื่อให้ Message Processor เข้าถึงไฟล์ได้
    3. Edge จะเพิ่มไลบรารีของบุคคลที่สามทั้งหมดใน /opt/apigee/edge-gateway/lib/thirdparty ไดเรกทอรีลงใน classpath

    4. รีสตาร์ท Message Processor โดยใช้คำสั่งต่อไปนี้
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

ตัวแปรโฟลว์

ต่อไปนี้เป็นตัวแปรนโยบาย LDAP ที่ SearchQuery ป้อนข้อมูล

ตัวแปร

คำอธิบาย

ldap.policyName.execution.success

หลังจากดำเนินการนโยบายแล้ว ตัวแปรโฟลว์นี้จะมีค่า "true" หรือ "false" ขึ้นอยู่กับผลลัพธ์

ldap.policyName.search.result[index].
  attribute.attrName[index]=value

รูปแบบที่ยืดหยุ่นของตัวแปรนี้ โดยเฉพาะอย่างยิ่งดัชนี จะพิจารณาแอตทริบิวต์หลายรายการ รวมถึงแอตทริบิวต์ที่มีหลายค่า ดัชนีเป็นตัวเลขที่เริ่มต้นที่ 1 หากไม่ได้ระบุดัชนี ระบบจะใช้ดัชนีเริ่มต้นเป็น 1

หากนโยบายแสดงผลที่อยู่ โทรศัพท์ และอีเมล คุณสามารถดึงแอตทริบิวต์แรก และค่าโดยใช้ตัวแปรต่อไปนี้

ldap.policyName.search.result.attribute.address
ldap.policyName.search.result.attribute.phone
ldap.policyName.search.result.attribute.email

หากต้องการดึงแอตทริบิวต์ที่อยู่ที่ 3 ในผลการค้นหา ให้ใช้ตัวแปรต่อไปนี้

ldap.policyName.search.result[3].attribute.address

หากแอตทริบิวต์มีหลายค่า (เช่น หากผู้ใช้มีอีเมลหลายรายการ ) คุณจะดึงอีเมลที่ 2 จากผลลัพธ์ได้ดังนี้

ldap.policyName.search.result.attribute.mail[2]

รหัสข้อผิดพลาด

ข้อผิดพลาดที่แสดงผลจากนโยบาย Edge จะเป็นไปตามรูปแบบที่สอดคล้องกันตามที่อธิบายไว้ใน ข้อมูลอ้างอิงรหัสข้อผิดพลาด

นโยบายนี้ใช้รหัสข้อผิดพลาดต่อไปนี้

รหัสข้อผิดพลาด ข้อความ
InvalidAttributeName Invalid attribute name {0}.
InvalidSearchBase Search base can not be empty.
InvalidValueForPassword Invalid value for password field. It can not be empty.
InvalidSearchScope Invalid scope {0}. Allowed scopes are {1}.
InvalidUserCredentials Invalid user credentials.
InvalidExternalLdapReference Invalid external ldap reference {0}.
LdapResourceNotFound Ldap resource {0} not found.
BaseDNRequired Base DN required.
OnlyReferenceOrValueIsAllowed Only value or reference is allowed for {0}.
AttributesRequired At least one attribute required for search action.
UserNameIsNull User name is null.
SearchQueryAndUserNameCannotBePresent Both search query and username can not be present in the authentication action. Please specify either one of them.