นโยบาย LDAP

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

อะไร

นโยบาย 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 ที่กำหนดเอง provider (ไม่ได้ให้บริการโดย Apigee) ให้ระบุคลาสเครื่องมือเชื่อมต่อ LDAP ที่มีคุณสมบัติครบถ้วน ซึ่งเป็นชั้นเรียนที่คุณใช้ ExternalLdapConProvider ของ Apigee ของ Google

LdapResource

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

BaseDN

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

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

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>

ค้นหา

Search

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

SearchQuery

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

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

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

Attributes

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

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

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

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

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

Apigee Edge สำหรับ 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 สำหรับ Private Cloud

ใช้ ผู้ให้บริการ LDAP

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

  1. ใช้อินเทอร์เฟซ ExternalLdapConProvider ในชั้นเรียนผู้ให้บริการ LDAP
    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

การใช้ LDAP SDK แบบไม่มีขอบเขตสำหรับ Java

คุณจะใช้ LDAP SDK แบบ UnboundID กับนโยบาย LDAP ได้ แต่ต้องดาวน์โหลดเวอร์ชันก่อน 2.3.1 และเพิ่มลงในเส้นทางคลาสของผู้ประมวลผลข้อความแต่ละเส้นทาง

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

  1. เปิดเบราว์เซอร์และไปที่ที่เก็บไฟล์ Sourceforge สำหรับ LDAP SDK แบบ UnboundID ดังนี้
    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 จากไฟล์ SDK ในรูปแบบ ZIP ตามตัวอย่างต่อไปนี้
    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. ในแต่ละโหนดตัวประมวลผลข้อความ
    1. คัดลอกไฟล์ JAR ไปยังส่วนของ ไดเรกทอรี /opt/apigee/edge-gateway/lib/thirdparty
    2. หากจำเป็น โปรดให้สิทธิ์ผู้ใช้ Apigee ในไฟล์ JAR เพื่อให้ผู้ประมวลผลข้อความเข้าถึงไฟล์ได้
    3. Edge เพิ่มไลบรารีของบุคคลที่สามทั้งหมดใน /opt/apigee/edge-gateway/lib/thirdparty ไปยัง classpath

    4. รีสตาร์ทโปรแกรมประมวลผลข้อความ
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

ตัวแปรโฟลว์

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

ตัวแปร

คำอธิบาย

ldap.policyName.execution.success

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

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

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

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

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

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.