簡體   English   中英

將 SignInManager 和 AspNetUserManager 注入 Asp.Net Core 2 中的中間件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM