我刚刚将中间件添加到我的代码中,当我想运行它时,它会出现此错误System.InvalidOperationException: 'Cannot resolve scoped service 'HORA_API.Model.AGUSContext' from root provider.'
这是程序. cs
global using HORA_API.Model;
using HORA_API.Middleware;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<AGUSContext>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
//app.UseAuthorization();
app.UseMiddleware<JwtMiddleware>();
app.MapControllers();
app.Run();
感谢你的帮助谢谢
编辑以添加:
异常的完整详细信息
系统操作无效异常HResult= 0x 80131509消息=无法从根提供程序解析作用域服务“HORA_API.Model.AGUSContext”。源=Microsoft.Extensions.DependencyInjection堆栈跟踪:在Microsoft.扩展.依赖注入.服务查找.调用站点验证器.验证解决方案(类型服务类型、IServiceScope作用域、IServiceScope根作用域)。扩展。依赖关系注入。服务提供程序。获取服务(在Microsoft中键入服务类型、服务提供商工程范围服务提供商工程范围)。扩展。内部。激活器实用程序。构造器匹配器。创建示例(IServiceProvider提供程序)。扩展。内部。激活器实用程序。创建示例(IServiceProvider提供程序,类型示例类型,对象[]参数)。〈〉c__DisplayClass5_0.b__0(接下来是请求委托),位于Microsoft.AspNetCore.Builder. Application Builder.Build(),位于Microsoft. AspNetCore.生成器. Web应用程序生成器. b__27_0(接下来是请求委托),位于Microsoft.AspNetCore.Builder. Application Builder.Build(),位于Microsoft. AspNetCore.主机.通用Web主机服务. d__37.下一步(),位于Microsoft.扩展.主机.内部.主机.d__12.下一步()位于Microsoft.扩展.主机.主机抽象主机扩展. d__4.下一步()位于Microsoft.扩展.主机.主机抽象主机扩展. d__4.下一步()在Microsoft.扩展.托管.托管抽象主机扩展.运行(IHost主机)在Microsoft.AspNetCore.Builder. Web应用程序.运行(字符串url)在C中的程序.$(字符串[]参数):\Hora vs 090123\API\HORA-API\HORA-API\程序.cs:第30行
中间件代码
public async Task Invoke(HttpContext context, AGUSContext dataService)
{
var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
if (token != null)
attachUserToContext(context, dataService, token);
await _next(context);
}
private void attachUserToContext(HttpContext context, AGUSContext dataService, string token)
{
try
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("SecretToken");
tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
// set clockskew to zero so tokens expire exactly at token expiration time (instead of 5 minutes later)
ClockSkew = TimeSpan.Zero
}, out SecurityToken validatedToken);
var jwtToken = (JwtSecurityToken)validatedToken;
var email = jwtToken.Claims.First(x => x.Type == "id").Value;
// attach user to context on successful jwt validation
var useremail = dataService.Otps.FirstOrDefault(v => v.AlamatEmail == email);
if (useremail != null)
{
context.Items["User"] = "Ok";
}
}
catch
{
// do nothing if jwt validation fails
// user is not attached to context so request won't have access to secure routes
}
属性授权
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context.HttpContext.Items["User"] == null)
{
// not logged in
context.Result = new JsonResult(new { message = "Unauthorized" }) { StatusCode = StatusCodes.Status401Unauthorized };
}
}
然后我在控制器上加了这个
private string generateJwtToken(string email)
{
// generate token that is valid for 7 days
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(otpcode);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[] { new Claim("id", email) }),
Expires = DateTime.UtcNow.AddDays(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
1条答案
按热度按时间9gm1akwq1#
注入中间件将从根生存期解析它,因为它没有访问范围的权限。请从上下文提供者解析它,因为它可以访问范围