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

如何在Microsoft Teams选项卡中将团队区域文化传递至OAuth后端?

问题描述

我基于Asp.net Core开发了一个Microsoft Teams应用,对接了OAuth后端认证服务。在Startup.cs阶段无法获取团队的区域文化,后续在cshtml页面中获取到了该文化信息,但找不到将其传递至OAuth后端的方法。

解决方案

核心思路是将前端拿到的culture参数传递到OAuth认证流程中,最终附加到授权请求的URL里,让OAuth后端可以读取到该参数。

步骤1:修改LoginPopup接收culture并触发带参数的认证挑战

更新LoginPopupModel的OnGetAsync方法,接收前端传入的culture参数,并在触发OAuth认证挑战时将该参数存入认证属性:

[Authorize]
public class LoginPopupModel : PageModel
{
    private readonly IHttpContextAccessor _httpContext;

    public LoginPopupModel(IHttpContextAccessor httpContextAccessor)
    {
        _httpContext = httpContextAccessor;
    }

    public async Task<IActionResult> OnGetAsync(string culture)
    {
        if (_httpContext.HttpContext.User.Identity.IsAuthenticated)
        {
            return RedirectToPage("LoginSuccess");
        }

        // 创建认证属性,携带culture参数
        var authProperties = new AuthenticationProperties
        {
            RedirectUri = "/LoginPopup",
            Items = { { "culture", culture } }
        };

        // 触发OAuth认证挑战
        return Challenge(authProperties, OAuthScheme);
    }
}

步骤2:在OAuth配置中添加事件,将culture附加到授权请求

修改Startup.cs中的AddOAuth配置,通过OnRedirectToAuthorizationEndpoint事件,把culture参数添加到OAuth授权端点的请求URL中:

.AddOAuth(OAuthScheme, options =>
{                
    var settings = JsonConvert.DeserializeObject<OnlineApiSettings>(Configuration["settings"]);
    options.ClientId = settings.ClientId;
    options.ClientSecret = settings.ClientSecret;
    options.AuthorizationEndpoint = settings.AuthEndpoint;
    options.TokenEndpoint = settings.TokenEndpoint;
    options.CallbackPath = new PathString("/oauth/callback");
    options.SaveTokens = true;

    // 自定义授权跳转事件,附加culture参数
    options.Events = new OAuthEvents
    {
        OnRedirectToAuthorizationEndpoint = context =>
        {
            if (context.Properties.Items.TryGetValue("culture", out var culture))
            {
                // 使用Asp.net Core的QueryHelpers添加查询参数
                var newRedirectUri = QueryHelpers.AddQueryString(
                    context.RedirectUri, 
                    "culture", 
                    culture
                );
                context.RedirectUri = newRedirectUri;
            }
            return Task.CompletedTask;
        }
    };
});

流程验证

  1. 前端调用loginV1时,从Teams context拿到culture,传递到/LoginPopup?culture=xxx
  2. LoginPopup检测到未认证,触发OAuth挑战,将culture存入认证属性
  3. OAuth中间件跳转授权端点时,读取属性中的culture,添加到授权URL的查询参数
  4. OAuth后端即可从授权请求的查询参数中获取到culture

内容的提问来源于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:55:12