C# 远程身份验证处理程序的SignInScheme不能设置为自身
我正在尝试在.NetCore WebApi中添加Google Jwt验证 我有一个独立的前端,它已经登录到Google并生成Jwt。 我希望在每次服务调用时将此Jwt传递到后端,以确保用户经过身份验证。(任何拥有谷歌账户的人都经过身份验证) 这是我到目前为止所拥有的 我的前端使用以下标题发出请求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
授权:持票人
我的控制器有一个简单的[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软件包