[英]Injecting SignInManager and AspNetUserManager to Middleware in Asp.Net Core 2
我正在嘗試將SignInManager<ApplicationUser>
和AspNetUserManager<ApplicationUser>
注入到我的 WebApi 的刷新令牌中間件中。 只是為了不使用身份,所以我的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:無法解析來自根提供程序的作用域服務“Microsoft.AspNetCore.Identity.SignInManager`1[ApplicationUser]”。
我嘗試添加以下瞬態;
services.AddTransient<IUserStore<ApplicationUser>, UserStore<ApplicationUser, ApplicationRole, MyDataContext, int>>();
services.AddTransient<SignInManager<ApplicationUser>>();
services.AddTransient<UserManager<ApplicationUser>>();
但是我似乎陷入了注入依賴項的困境,因為它現在也要求注入 UserStore? 有沒有更簡單的方法來注入這些服務?
您可能有一種更簡單的方法來訪問您的中間件中的這些服務。 考慮以下方法,而不是嘗試將 SignInManager signInManager 和 AspNetUserManager userManager 直接注入到您的中間件中,而是注入 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.