如何在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
相关产品推荐
相关产品推荐

