C# 远程身份验证处理程序的SignInScheme不能设置为自身

C# 远程身份验证处理程序的SignInScheme不能设置为自身,c#,asp.net-core,jwt,google-authentication,C#,Asp.net Core,Jwt,Google Authentication,我正在尝试在.NetCore WebApi中添加Google Jwt验证 我有一个独立的前端,它已经登录到Google并生成Jwt。 我希望在每次服务调用时将此Jwt传递到后端,以确保用户经过身份验证。(任何拥有谷歌账户的人都经过身份验证) 这是我到目前为止所拥有的 我的前端使用以下标题发出请求 授权:持票人 我的控制器有一个简单的[Authorize]属性 [HttpGet] [Authorize] public IEnumerable<W

我正在尝试在.NetCore WebApi中添加Google Jwt验证

我有一个独立的前端,它已经登录到Google并生成Jwt。 我希望在每次服务调用时将此Jwt传递到后端,以确保用户经过身份验证。(任何拥有谷歌账户的人都经过身份验证)

这是我到目前为止所拥有的

我的前端使用以下标题发出请求
授权:持票人

我的控制器有一个简单的[Authorize]属性

        [HttpGet]
        [Authorize]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }

使用JWT时,有用的一行代码:

int userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
当我需要检查请求是否来自注册用户或用户ID时,我使用了这个或类似的部分

在startup.cs中:

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
                   .AddJwtBearer(options =>
                   {
                       options.TokenValidationParameters = new TokenValidationParameters
                       {
                           ValidateIssuerSigningKey = true,
                           IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("AppSettings:Secret").Value)),
                           ValidateIssuer = false,
                           ValidateAudience = false
                       };
                       options.Events = new JwtBearerEvents
                       {
                           OnMessageReceived = context =>
                           {
                               var accessToken = context.Request.Query["access_token"];

                               // If the request is for our hub...
                               var path = context.HttpContext.Request.Path;
                               if (!string.IsNullOrEmpty(accessToken) &&
                                   (path.StartsWithSegments("/chat")))
                               {
                                   // Read the token out of the query string
                                   context.Token = accessToken;
                               }
                               return Task.CompletedTask;
                           }
                       };
                   });
我使用SignalR来实现消息传递系统,所以您可能不需要每一行代码,但这就是我在项目后端使用JWT的方式


关于谷歌认证,您可以查看以下帖子:

使用JWT时有用的一行:

int userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
当我需要检查请求是否来自注册用户或用户ID时,我使用了这个或类似的部分

在startup.cs中:

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
                   .AddJwtBearer(options =>
                   {
                       options.TokenValidationParameters = new TokenValidationParameters
                       {
                           ValidateIssuerSigningKey = true,
                           IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("AppSettings:Secret").Value)),
                           ValidateIssuer = false,
                           ValidateAudience = false
                       };
                       options.Events = new JwtBearerEvents
                       {
                           OnMessageReceived = context =>
                           {
                               var accessToken = context.Request.Query["access_token"];

                               // If the request is for our hub...
                               var path = context.HttpContext.Request.Path;
                               if (!string.IsNullOrEmpty(accessToken) &&
                                   (path.StartsWithSegments("/chat")))
                               {
                                   // Read the token out of the query string
                                   context.Token = accessToken;
                               }
                               return Task.CompletedTask;
                           }
                       };
                   });
我使用SignalR来实现消息传递系统,所以您可能不需要每一行代码,但这就是我在项目后端使用JWT的方式


关于谷歌认证,你可以查看这篇文章:

我可以使用这篇文章中列出的khellang软件包我可以使用这篇文章中列出的khellang软件包