gpt4 book ai didi

c# - 在 Asp.Net Core 2 中将 SignInManager 和 AspNetUserManager 注入(inject)中间件

转载 作者:行者123 更新时间:2023-12-03 09:37:58 25 4
gpt4 key购买 nike

我正在尝试注入(inject) SignInManager<ApplicationUser>AspNetUserManager<ApplicationUser>进入我的 WebApi 的刷新 token 中间件。只是为了不使用身份,所以我的ApplicationUser类是
public class ApplicationUser : IdentityUser<int>, IEntity
在我的中间件构造函数中,我有;

private readonly AuthService _service;

public TokenProviderMiddleware(
RequestDelegate next,
Func<IMyDataContext> context,
SignInManager<ApplicationUser> signInManager,
AspNetUserManager<ApplicationUser> userManager)
{
_next = next;

_serializerSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented
};

_service = new AuthService(context, signInManager, userManager);
}

在我的 Startup.cs 中,我有以下内容;
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDataContext>(
options => options.UseSqlServer(DbGlobals.DevDatabase));

services.AddTransient<IMyDataContext, MyDataContext>();
services.AddTransient<Func<IMyDataContext>>(provider => () => provider.GetService<IMyDataContext>());

services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<BemfeitoDataContext>()
.AddDefaultTokenProviders();

services.Configure<IdentityOptions>(options =>
{
// Password settings
options.Password.RequireDigit = true;
options.Password.RequiredLength = 8;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = true;
options.Password.RequireLowercase = false;
options.Password.RequiredUniqueChars = 6;

// Lockout settings
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
options.Lockout.MaxFailedAccessAttempts = 10;
options.Lockout.AllowedForNewUsers = true;

// User settings
options.User.RequireUniqueEmail = true;
});

// Configure JwtIssuerOptions
services.Configure<JwtIssuerOptions>(options =>
{
options.Issuer = JwtSettings.Issuer;
options.Audience = JwtSettings.Audience;
options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
});

var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = JwtSettings.Issuer,

ValidateAudience = true,
ValidAudience = JwtSettings.Audience,

ValidateIssuerSigningKey = true,
IssuerSigningKey = _signingKey,

RequireExpirationTime = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(configureOptions =>
{
configureOptions.ClaimsIssuer = JwtSettings.Issuer;
configureOptions.TokenValidationParameters = tokenValidationParameters;
configureOptions.SaveToken = true;
configureOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
Console.WriteLine("OnAuthenticationFailed: " +
context.Exception.Message);
return Task.CompletedTask;
},
OnTokenValidated = context =>
{
Console.WriteLine("OnTokenValidated: " +
context.SecurityToken);
return Task.CompletedTask;
}
};
});

// api user claim policy
services.AddAuthorization(options =>
{
options.AddPolicy("ApiUser", policy => policy.RequireClaim(JwtClaimIdentifiers.Rol, JwtClaims.ApiAccess));
});

services.AddMvc();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseHttpErrorHandlerMiddleware();

app.UseTokenProviderMiddleware();
app.UseRefreshTokenProviderMiddleware();
app.UseAuthentication();

app.UseMvc();

}

当我运行它时,我收到以下错误;

InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.SignInManager`1[ApplicationUser]' from root provider.



我尝试添加以下 transient ;
        services.AddTransient<IUserStore<ApplicationUser>, UserStore<ApplicationUser, ApplicationRole, MyDataContext, int>>();
services.AddTransient<SignInManager<ApplicationUser>>();
services.AddTransient<UserManager<ApplicationUser>>();

但是我似乎陷入了注入(inject)依赖的兔子洞,因为它现在也要求注入(inject) UserStore?有没有更简单的方法可以注入(inject)这些服务?

最佳答案

您可能有一种更简单的方法可以在中间件中访问这些服务。考虑以下方法,而不是尝试将 SignInManager signInManager 和 AspNetUserManager userManager 直接注入(inject)中间件,而是注入(inject) Microsoft.AspNetCore.Http.IHttpContextAccessor _httpContextAccessor
然后您可以使用 _httpContextAccessor 访问 signInManager 和 userManager 服务,如下所示:

var userManager = _httpContextAccessor.HttpContext.RequestServices.GetService<AspNetUserManager<ApplicationUser>>();
var signInManager = _httpContextAccessor.HttpContext.RequestServices.GetService<SignInManager<ApplicationUser>>();
还要确保您的中间件类具有以下 using 语句: using Microsoft.Extensions.DependencyInjection;

关于c# - 在 Asp.Net Core 2 中将 SignInManager 和 AspNetUserManager 注入(inject)中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49359615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com