You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure Bot的OAuth登录链接中传入团队语言culture参数?

解决Azure Bot OAuth登录链接添加团队语言culture参数的问题

为什么直接拼接参数无效

你之前直接拼接culture参数的方法之所以失效,是因为GetSignInLinkAsync生成的登录链接包含签名验证参数,直接修改链接会破坏签名合法性,导致OAuth服务拒绝处理该请求。

可行方案

方案1:通过Generic OAuth V2配置自动注入(推荐)

如果你的OAuth连接是在Azure Portal中配置的Generic OAuth V2类型:

  • 进入Bot资源的「设置」→「OAuth连接设置」,编辑目标连接
  • 在「授权URL」中,将culture参数作为动态占位符加入,示例:
    原授权URL:https://oauthprovider/auth
    修改后:https://oauthprovider/auth?culture={locale}
  • 保存配置后,Bot Framework会自动将{locale}替换为当前对话的语言区域(即turnContext.Activity.GetLocale()的值),生成的登录链接会自动带上正确的culture参数,无需代码修改。

方案2:代码层面自定义登录链接(灵活控制)

若需要更灵活的参数处理逻辑,可通过自定义SignInLinkFactory或手动处理链接的方式实现:

方法A:使用OAuthPromptOptions自定义链接生成逻辑

var oauthPromptOptions = new OAuthPromptOptions
{
    Prompt = MessageFactory.Text("请登录以继续"),
    ConnectionName = "你的OAuth连接名称",
    SignInLinkFactory = async (turnContext, connectionName, userId, cancellationToken) =>
    {
        var locale = turnContext.Activity.GetLocale();
        // 获取原始带签名的登录链接
        var originalLink = await turnContext.Adapter.GetSignInLinkAsync(turnContext, connectionName, userId, cancellationToken);
        
        // 使用UriBuilder安全添加参数,避免破坏签名和格式错误
        var uriBuilder = new UriBuilder(originalLink);
        var queryParams = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);
        queryParams["culture"] = locale;
        uriBuilder.Query = queryParams.ToString();
        
        return uriBuilder.ToString();
    }
};

await dc.PromptAsync("OAuthPrompt", oauthPromptOptions, cancellationToken);

方法B:手动创建SignInCard时处理链接

var locale = turnContext.Activity.GetLocale();
var connectionName = "你的OAuth连接名称";
var userId = turnContext.Activity.From.Id;

// 获取原始登录链接
var originalSignInLink = await turnContext.Adapter.GetSignInLinkAsync(turnContext, connectionName, userId, cancellationToken);

// 安全添加culture参数
var uriBuilder = new UriBuilder(originalSignInLink);
var queryParams = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);
queryParams["culture"] = locale;
uriBuilder.Query = queryParams.ToString();
var updatedSignInLink = uriBuilder.ToString();

// 创建并发送登录卡片
var signInCard = new SignInCard
{
    Text = "请登录以继续操作",
    Buttons = new List<CardAction>
    {
        new CardAction(ActionTypes.Signin, "登录", value: updatedSignInLink)
    }
};

var reply = MessageFactory.Attachment(signInCard.ToAttachment());
await turnContext.SendActivityAsync(reply, cancellationToken);

内容的提问来源于stack exchange,提问作者user25879

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:45:26