最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How to get access to the access_token in Jwt scheme which is available in OAuth Scheme in ASP.NET Core Web API - Stack Overflow

programmeradmin2浏览0评论

The ABB scheme is responsible for handling the third-party login and will return the following values:

access_token, id_token (also known as jwt_token), token_type = "Bearer" ,expire_in

The JWT scheme handles the frontend login to the ASP.NET Core Web API. In this flow, the API returns only the id_token (JWT token) to the frontend. However, in order to fetch additional claims (such as user information) via the user API on OnTokenValidated we need access to the access_token which is not available in JWT scheme, how to access this?

builder.Services.AddAuthentication(options =>
    {
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = "Bearer";
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    })
   .AddJwtBearer("Bearer", async options =>

        options.Authority = "";  // e.g., IdentityServer 3rd party
        options.Audience = "";
        options.RequireHttpsMetadata = false;
        options.SaveToken = true;

        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
        };// Set to true if using HTTPS
        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = async context =>
                   {
                       var principal = context.Principal;
                       var identity = context.HttpContext.User.Identity;

                       var access_token = context.Request.Headers["access_token"].ToString();

                       if (!string.IsNullOrEmpty(access_token))
                       {
                           //Needs to call userInfo fot that access_token needed, but for FE jwt token Id_token only passed. 
                           var userInfo = await GetUserInfoFromThirdParty(access_token);
                           var claimsIdentity = (ClaimsIdentity)context.Principal.Identity;

                       }

                       // Custom logic after successful token validation (e.g., logging)
                       await Task.CompletedTask;
                   }
        };
    })


    .AddCookie("default")
    //Token endpoint here will return Id_token (jwt token) and access_token which is used to get userinfo and claims 
   .AddOAuth("ABB", o =>
   {
    o.SignInScheme = "default";
    o.ClientId = "";
    o.ClientSecret = "";
    o.AuthorizationEndpoint = "";
    o.TokenEndpoint = "";
    o.CallbackPath = "/userinfo";
    o.SaveTokens = true;
    o.UserInformationEndpoint = "";
    o.Scope.Add("openid");
    o.Scope.Add("entitlement_group");
    o.Scope.Add("profile");
    o.ClaimActions.MapJsonKey("Permissions", "entitlement_group");

    o.Events = new OAuthEvents
    {

        OnCreatingTicket = async ctx =>
        {

            using var request = new HttpRequestMessage(HttpMethod.Get, ctx.Options.UserInformationEndpoint);
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", ctx.AccessToken);
            using var result = await ctx.Backchannel.SendAsync(request);
            var user = await result.Content.ReadFromJsonAsync<JsonElement>();

            var identity = (ClaimsIdentity)ctx.Principal.Identity;

            // Manually adding claims based on user data
            identity.AddClaim(new Claim("entitlement_group", user.GetProperty("entitlement_group").ToString()));

            ctx.RunClaimActions(user);

            JObject response = JObject.Parse(ctx.TokenResponse.Response.RootElement.ToString());
            var idToken = response.Value<string>("id_token");

            var handler = new JwtSecurityTokenHandler();
            var jwtToken = handler.ReadJwtToken(idToken);

            if (jwtToken != null)
            {
                // Passing jwt token for FE
                identity = new ClaimsIdentity(jwtToken?.Claims, "Bearer", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
                identity.AddClaim(new Claim("idToken", idToken));
                ctx.Principal = new ClaimsPrincipal(identity);
               }
           }
       };
   });

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>