如何在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; } }; });
流程验证
- 前端调用
loginV1时,从Teams context拿到culture,传递到/LoginPopup?culture=xxx - LoginPopup检测到未认证,触发OAuth挑战,将
culture存入认证属性 - OAuth中间件跳转授权端点时,读取属性中的
culture,添加到授权URL的查询参数 - OAuth后端即可从授权请求的查询参数中获取到
culture
内容的提问来源于stack exchange,提问作者user25879
相关产品推荐
相关产品推荐

