使用 context.RunClaimsAction(user) 在 asp.net 错误中实现 OAuth

Cam*_*teh 4 asp.net oauth-2.0

我想实现的OAuth在asp.net 3.0,我的理解有一些变化关于在Microsoft.AspNetCore.Authentication的API替换更改Newtonsoft.Json类型]连结这里

它不接受用户声明的 JObject 并在您尝试将 JObject 作为参数传递给 RunClaimActions(user) 时抛出错误,并且在您运行该方法时未在方法中传递用户 JObject 参数时不会抛出错误. 结果是它不会将 User 声明返回给视图。有没有人遇到过这个问题?有没有办法将 newtonsoft JObject 转换为 JsonElement。

options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
                options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
                options.ClaimActions.MapJsonKey("urn:github:login", "login");
                options.ClaimActions.MapJsonKey("urn:github:url", "html_url");
                options.ClaimActions.MapJsonKey("urn:github:avatar", "avatar_url");

                options.Events = new OAuthEvents
                {
                    OnCreatingTicket = async context =>
                    {
                        var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

                        var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                        response.EnsureSuccessStatusCode();

                        var user = JObject.Parse(await response.Content.ReadAsStringAsync());
                        context.RunClaimActions(user);



                    }


                };
            });
Run Code Online (Sandbox Code Playgroud)

Cam*_*teh 12

经过一些阅读,我通过使用 JsonDocument 解析声明并将根文档传递给 RunClaimActions 方法解决了这个问题。

    options.Events = new OAuthEvents
                {
                    OnCreatingTicket = async context =>
                    {
                        var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

                        var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                        response.EnsureSuccessStatusCode();

                        var user = JsonDocument.Parse(await response.Content.ReadAsStringAsync());                                              
                        context.RunClaimActions(user.RootElement);



                    }
Run Code Online (Sandbox Code Playgroud)