แชร์ผ่าน


กําหนดค่าเอเจนต์ .NET ของคุณเพื่อใช้ OAuth

OAuth สําหรับตัวแทน .NET ถูกเตรียมใช้งานบนทรัพยากร Azure Bot ของคุณก่อนและการลงทะเบียนแอปที่สอดคล้องกัน จากนั้นระบบรันไทม์ของเอเจนต์จะจัดการรับและรีเฟรชโทเค็นผู้ใช้ให้กับคุณผ่านความสามารถในการลงชื่อเข้าใช้อัตโนมัติ AgentApplication การลงชื่อเข้าใช้อัตโนมัติสามารถเรียกใช้ส่วนกลาง (ประเภทกิจกรรมทั้งหมด) หรือเลือกเพื่อให้สามารถร้องขอโทเค็นได้เฉพาะเส้นทางหรือกิจกรรมบางประเภทเท่านั้น

คุณสามารถลงทะเบียนตัวจัดการ OAuth หลายตัวในการกําหนดค่าและกําหนดตัวจัดการดังกล่าวให้กับเส้นทางเฉพาะ หรือประกาศตัวจัดการเริ่มต้นเดียวที่ใช้ทุกที่ แต่ละตัวจัดการสามารถเลือกที่จะดำเนินการแลกเปลี่ยน On-Behalf-Of (OBO) เมื่อมีการกำหนดค่าไว้ฝั่ง Azure สําหรับการเริ่มต้นอย่างรวดเร็ว ดู ตัวอย่าง AutoSignIn หรือดัดแปลงการกําหนดค่าที่แสดงที่นี่ลงในตัวแทนที่มีอยู่

ส่วนต่อไปนี้อธิบายวิธีการกำหนดค่า UserAuthorization, ตัดสินใจระหว่างวิธีการแบบรวมศูนย์และตามเส้นทาง, และดึงโทเค็น (ทั้งแบบมาตรฐานและ OBO) ออกมาระหว่างช่วงการประมวลผล นอกจากนี้ยังมีคําแนะนําระดับภูมิภาคสําหรับการปรับใช้ที่ไม่ใช่ในสหรัฐอเมริกา

มีการกําหนดค่าตัวแทน .NET ใน appsettings หรือผ่านโค้ดในProgram.cs เอกสารนี้แสดงรายละเอียดโดยใช้ appsettings

การตั้งค่า

วัตถุ UserAuthorization ภายใน AgentApplication ควบคุมว่าได้รับโทเค็นผู้ใช้มาอย่างไร JSON ต่อไปนี้แสดงโครงสร้างแบบลําดับชั้นตามด้วยตารางที่อธิบายแต่ละคุณสมบัติสําหรับ UserAuthorization และ สําหรับวัตถุที่ Settings ซ้อนกัน

  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "{{handler-name}}",
      "AutoSignIn": true | false,
      "Handlers": {
        "{{handler-name}}": {
          "Settings": {
            "AzureBotOAuthConnectionName": "{{azure-bot-connection-name}}",
            "OBOConnectionName": "{{connection-name}}",
            "OBOScopes": [
              "{{obo-scope}}"
            ],
            "Title": "{{signin-card-title}}",
            "Text": "{{signin-card-button-text}}",
            "InvalidSignInRetryMax": {{int}},
            "InvalidSignInRetryMessage": {{invalid-attempt-message}},
            "Timeout": {{timeout-ms}}
          }
        }
      }
    }
  }

คุณสมบัติการอนุญาตผู้ใช้

ตารางต่อไปนี้แสดงรายการคุณสมบัติระดับ UserAuthorization บนสุดที่กําหนดวิธีเลือกตัวจัดการและวิธีรับโทเค็นสําหรับแต่ละกิจกรรมที่เข้ามา

ทรัพย์สิน ต้องมี ประเภท คำอธิบาย
DefaultHandlerName ไม่ (แนะนํา) สตริง ชื่อของตัวจัดการที่ใช้เมื่อ AutoSignIn ประเมินเป็น true และไม่ได้ระบุการแทนที่แต่ละเส้นทาง
AutoSignIn ไม่ bool หรือ delegate เมื่อเป็นจริง (ค่าเริ่มต้น) ตัวแทนจะพยายามรับโทเค็นสําหรับทุกกิจกรรมที่เข้ามา สามารถถูกแทนที่ขณะทํางานด้วย Options.AutoSignIn เพื่อกรองชนิดกิจกรรมได้
Handlers ใช่ (อย่างน้อยหนึ่งรายการ) object (พจนานุกรม) การจับคู่ชื่อตัวจัดการกับการตั้งค่า แต่ละคีย์ต้องไม่ซ้ำกัน

เมื่อต้องการจํากัดกิจกรรมที่นําไปใช้กับการลงชื่อเข้าใช้อัตโนมัติ ให้ตั้งค่าเพรดิเคตที่คล้ายกับ: Options.AutoSignIn = (context, ct) => Task.FromResult(context.Activity.IsType(ActivityTypes.Message));

คุณสมบัติการตั้งค่า

ตารางต่อไปนี้อธิบายวัตถุที่ซ้อนกันที่ Settings นําไปใช้กับตัวจัดการ OAuth แต่ละตัว ควบคุมงานนําเสนอการ์ดลงชื่อเข้าใช้ ลักษณะการทํางานการลองใหม่ การหมดเวลา และการกําหนดค่าการแลกเปลี่ยน OBO ทางเลือก

ทรัพย์สิน ต้องมี ประเภท คำอธิบาย
AzureBotOAuthConnectionName ใข่ สตริง ชื่อการเชื่อมต่อ OAuth ที่กําหนดไว้บนทรัพยากร Azure Bot
OBOConnectionName ไม่ใช่ (OBO เท่านั้น) สตริง ชื่อของการเชื่อมต่อ SDK ของตัวแทนที่ใช้ในการดําเนินการแลกเปลี่ยนโทเค็นในนามของผู้ใช้
OBOScopes ไม่ใช่ (OBO เท่านั้น) string[] ขอบเขตที่ร้องขอระหว่างการแลกเปลี่ยน OBO ถ้าเว้นไว้ด้วย OBOConnectionName คุณสามารถเรียกใช้ ExchangeTurnTokenAsync ด้วยตนเองได้
Title ไม่ สตริง ชื่อการ์ดลงชื่อเข้าใช้แบบกําหนดเอง มีค่าเริ่มต้นเป็นลงชื่อเข้าใช้
Text ไม่ สตริง ข้อความปุ่มการ์ดลงชื่อเข้าใช้ ค่าเริ่มต้นเป็น โปรดลงชื่อเข้าใช้
InvalidSignInRetryMax ไม่ int จํานวนสูงสุดของการลองใหม่ที่ได้รับอนุญาตเมื่อผู้ใช้ป้อนรหัสที่ไม่ถูกต้อง ค่าเริ่มต้นคือ 2
InvalidSignInRetryMessage ไม่ สตริง ข้อความที่แสดงหลังจากป้อนรหัสไม่ถูกต้อง ค่าเริ่มต้นเป็น รหัสการลงชื่อเข้าใช้ไม่ถูกต้อง โปรดป้อนรหัส 6 หลัก
Timeout ไม่ int (ms) จํานวนมิลลิวินาทีก่อนที่ความพยายามในการลงชื่อเข้าใช้ที่กําลังดําเนินการจะหมดอายุ ค่าเริ่มต้นคือ 900000 (15 นาที)

ต้องการใช้ชนิดใด

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

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

ใช้โทเค็นในโค้ด (ไม่ใช่ OBO)

ส่วนนี้แสดงวิธีการเรียกใช้และใช้โทเค็นผู้ใช้ที่ส่งคืนโดยตรงจากการเชื่อมต่อ Azure Bot OAuth ของคุณโดยไม่ต้องดําเนินการแลกเปลี่ยนในนามของ ตัดสินใจก่อนว่าคุณชอบตัวจัดการการลงชื่อเข้าใช้อัตโนมัติส่วนกลางหรือต่อเส้นทางมากกว่า จากนั้น ภายในตัวจัดการกิจกรรมของคุณ เรียกใช้ UserAuthorization.GetTurnTokenAsync สายที่สุดเพื่อให้ SDK สามารถรีเฟรชโทเค็นหากใกล้หมดอายุ ตัวอย่างต่อไปนี้แสดงรูปแบบทั้งสอง

การกําหนดค่าเฉพาะการลงชื่อเข้าใช้อัตโนมัติเท่านั้น

ใช้การกําหนดค่านี้เมื่อการลงชื่อเข้าใช้อัตโนมัติส่วนกลางควรได้รับโทเค็นสําหรับทุกกิจกรรมที่เข้ามาโดยไม่จําเป็นต้องระบุตัวจัดการสําหรับแต่ละเส้นทาง

  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "auto",
      "Handlers": {
        "auto": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
          }
        }
      }
    }
  },

โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:

public class MyAgent : AgentApplication
{
    public MyAgent(AgentApplicationOptions options) : base(options)
    {
        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
    }

    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var token = await UserAuthorization.GetTurnTokenAsync(turnContext);

        // use the token 
    }
}

การกำหนดค่าแต่ละเส้นทางเท่านั้น

ใช้การตั้งค่าคอนฟิกแต่ละเส้นทางเมื่อคุณต้องการการควบคุมแบบละเอียด: เฉพาะเส้นทางที่คุณทําเครื่องหมายรับโทเค็นไว้อย่างชัดเจนเท่านั้น การกําหนดค่าต่อเส้นทางจะลดการค้นคืนโทเค็นที่ไม่จําเป็น อนุญาตให้มีเส้นทางที่แตกต่างกันในการเชื่อมต่อ OAuth ที่แตกต่างกัน (และดังนั้นจึงเป็นแหล่งข้อมูลหรือขอบเขตที่แตกต่างกัน) และช่วยให้คุณสามารถผสมเส้นทางที่รับรองความถูกต้องและไม่ได้รับการรับรองความถูกต้องภายในตัวแทนเดียวกัน ในตัวอย่างต่อไปนี้ การลงชื่อเข้าใช้อัตโนมัติส่วนกลางถูกปิดใช้งาน และตัวจัดการเดียว messageOauth แนบมากับเส้นทางข้อความเท่านั้น

  "AgentApplication": {
    "UserAuthorization": {
      "AutoSignIn": false,
      "Handlers": {
        "messageOauth": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
          }
        }
      }
    }
  },

โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:

public class MyAgent : AgentApplication
{
    public MyAgent(AgentApplicationOptions options) : base(options)
    {
        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last, autoSignInHandlers: ["messageOauth"]);
    }

    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var token = await UserAuthorization.GetTurnTokenAsync(turnContext, "messageOauth");

        // use the token
    }
}

ใช้ GetTurnTokenAsync

เรียกใช้ GetTurnTokenAsync เมื่อใดก็ตามที่คุณต้องการโทเค็นผู้ใช้ในระหว่างการเปลี่ยน คุณสามารถเรียกใช้ได้หลายครั้ง เรียกใช้ทันทีก่อนใช้งานเพื่อให้จัดการตรรกะการรีเฟรช (หากจําเป็น) อย่างโปร่งใส

ใช้โทเค็นในโค้ด (OBO)

On-Behalf-Of (OBO) อาศัยการลงชื่อเข้าใช้ของผู้ใช้เริ่มต้นเพื่อส่งกลับโทเค็นที่สามารถเปลี่ยนได้ ที่กําหนดขอบเขตของการเชื่อมต่อ OAuth เพื่อรวมขอบเขตที่สอดคล้องกับขอบเขตที่เปิดเผยโดย API การสตรีม (ตัวอย่างเช่น ถ้าขอบเขตที่ถูกเปิดเผยคือ defaultScopesขอบเขตที่กําหนดค่าอาจเป็น api://botid-{{clientId}}/defaultScopes) จากนั้น Agents SDK จะดําเนินการแลกเปลี่ยนไลบรารีการรับรองความถูกต้อง Microsoft (MSAL) โดยใช้การเชื่อมต่อที่กําหนดค่าไว้ซึ่งระบุโดย OBOConnectionName และรายการของOBOScopes เมื่อมีทั้ง OBOConnectionName และ OBOScopes ในการกําหนดค่าการแลกเปลี่ยนเกิดขึ้นโดยอัตโนมัติ และคุณได้รับโทเค็นสุดท้ายผ่านGetTurnTokenAsync หากอย่างใดอย่างหนึ่งหายไป คุณสามารถดําเนินการแลกเปลี่ยนอย่างชัดเจนในขณะทํางานด้วย ExchangeTurnTokenAsyncช่วยให้คุณสามารถแก้ไขการเชื่อมต่อหรือรายการขอบเขตแบบไดนามิกได้

OBO ในการกําหนดค่า

ใช้รูปแบบนี้เมื่อคุณทราบทรัพยากรปลายทางและขอบเขตที่คุณต้องการในเวลาการกําหนดค่า เมื่อคุณระบุทั้ง OBOConnectionName และ OBOScopesSDK จะดําเนินการในนามของการแลกเปลี่ยนระหว่างการลงชื่อเข้าใช้โดยอัตโนมัติ ซึ่งหมายความว่าการเรียกในภายหลังเพื่อ GetTurnTokenAsync ส่งกลับโทเค็น OBO โดยตรงโดยไม่ต้องมีรหัสรันไทม์เพิ่มเติม

  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "auto",
      "Handlers": {
        "auto": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
            "OBOConnectionName": "ServiceConnection",
            "OBOScopes": [
              "https://myservicescope.com/.default"
            ]
          }
        }
      }
    }
  },
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "FederatedCredentials",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
        "ClientId": "{{ClientId}}",
        "FederatedClientId": "{{ManagedIdentityClientId}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:

public class MyAgent : AgentApplication
{
    public MyAgent(AgentApplicationOptions options) : base(options)
    {
        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
    }

    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var token = await UserAuthorization.GetTurnTokenAsync(turnContext);

        // use the token
    }
}

OBO Exchange ที่รันไทม์

ใช้การแลกเปลี่ยนรันไทม์เมื่อทรัพยากรปลายทาง ขอบเขต หรือแม้แต่การเชื่อมต่อที่คุณต้องใช้ไม่สามารถแก้ไขได้ในการกําหนดค่า —ตัวอย่างเช่น เมื่อขอบเขตขึ้นอยู่กับผู้เช่า บทบาทผู้ใช้ หรือค่าสถานะคุณลักษณะ ในแบบจําลองนี้ คุณกําหนดค่า (ไม่บังคับ) OBOConnectionNameจากนั้นเรียกใช้ ExchangeTurnTokenAsync ด้วยขอบเขตที่คุณตัดสินใจที่จะเปลี่ยนผ่านโทเค็นที่คุณสามารถนําไปใช้ได้ทันที

  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "auto",
      "Handlers": {
        "auto": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
            "OBOConnectionName": "ServiceConnection"
          }
        }
      }
    }
  },
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "FederatedCredentials",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
        "ClientId": "{{ClientId}}",
        "FederatedClientId": "{{ManagedIdentityClientId}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:

public class MyAgent : AgentApplication
{
    public MyAgent(AgentApplicationOptions options) : base(options)
    {
        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
    }

    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var scopes = GetScopes();

        var exchangedToken = await UserAuthorization.ExchangeTurnTokenAsync(turnContext, exchangeScopes: scopes);

        // use the token
    }
}

การตั้งค่า OAuth ระดับภูมิภาค

สําหรับภูมิภาคที่ไม่ใช่ของสหรัฐอเมริกา คุณจําเป็นต้องอัปเดตตําแหน่งข้อมูลบริการโทเค็นที่ตัวแทนของคุณใช้

เพิ่มรายการต่อไปนี้ลงใน appsettings.json:

"RestChannelServiceClientFactory": {
   "TokenServiceEndpoint": "{{service-endpoint-uri}}"
}

สําหรับ service-endpoint-urlใช้ค่าที่เหมาะสมจากตารางต่อไปนี้สําหรับบอทระบบคลาวด์สาธารณะที่มีที่เก็บข้อมูลในภูมิภาคที่ระบุ

URI ขอบเขต
https://europe.api.botframework.com ยุโรป
https://unitedstates.api.botframework.com ประเทศสหรัฐอเมริกา
https://india.api.botframework.com อินเดีย