【问题标题】:Change log level for UserManager更改 UserManager 的日志级别
【发布时间】:2021-07-26 03:58:03
【问题描述】:

Microsoft.AspNetCore.Identity.UserManager 将无效密码记录为日志级别Warning。 我怎样才能将其降级为信息?日志里有点吵……

【问题讨论】:

  • 您可以在 appsettings 文件中进行配置,查看文档docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/…
  • 是的,刚刚发现。身份源代码没有任何调整级别的机制
  • 如果您将其降级为 info 上面的所有内容,例如 info、warning、error 和critical,都会被记录下来。如果您想要更少的日志记录,则需要将其设置为更高级别 docs.microsoft.com/en-us/dotnet/api/…
  • 将其增加到错误
  • 您能告诉我您使用了哪些代码记录了无效密码吗?据我所知,身份会使用signInManager.PasswordSignInAsync来检查密码。它只会添加`ModelState.AddModelError(string.Empty, "Invalid login attempt.");`.

标签: c# .net asp.net-core asp.net-core-identity


【解决方案1】:

根据您的描述,我建议您可以考虑创建一个自定义的SignInManager,并修改与日志相关的代码。

更多细节,您可以参考以下代码:

using AspNetCoreNormalIssue.Data;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace AspNetCoreNormalIssue
{
    public class ApplicationSignInManager : SignInManager<IdentityUser>
    {
        private readonly UserManager<IdentityUser> _userManager;
        private readonly ApplicationDbContext _dbContext;
        private readonly IHttpContextAccessor _contextAccessor;

        public ApplicationSignInManager(
UserManager<IdentityUser> userManager,
            IHttpContextAccessor contextAccessor,
            IUserClaimsPrincipalFactory<IdentityUser> claimsFactory,
            IOptions<IdentityOptions> optionsAccessor,
            ILogger<SignInManager<IdentityUser>> logger,
            IAuthenticationSchemeProvider schemes,
            IUserConfirmation<IdentityUser> confirmation
            )
            : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes, confirmation)
        {
            _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
            _contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
             Logger = logger;
        }
        public override async Task<SignInResult> CheckPasswordSignInAsync(IdentityUser user, string password, bool lockoutOnFailure)
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            var error = await PreSignInCheck(user);
            if (error != null)
            {
                return error;
            }

            if (await UserManager.CheckPasswordAsync(user, password))
            {
                var alwaysLockout = AppContext.TryGetSwitch("Microsoft.AspNetCore.Identity.CheckPasswordSignInAlwaysResetLockoutOnSuccess", out var enabled) && enabled;
                // Only reset the lockout when not in quirks mode if either TFA is not enabled or the client is remembered for TFA.
                if (alwaysLockout || !await IsTfaEnabled(user) || await IsTwoFactorClientRememberedAsync(user))
                {
                    await ResetLockout(user);
                }

                return SignInResult.Success;
            }

            //Modify to log error or else based on your requirement.
            Logger.LogError("InvalidPassword", "User failed to provide the correct password.");

            if (UserManager.SupportsUserLockout && lockoutOnFailure)
            {
                // If lockout is requested, increment access failed count which might lock out the user
                await UserManager.AccessFailedAsync(user);
                if (await UserManager.IsLockedOutAsync(user))
                {
                    return await LockedOut(user);
                }
            }
            return SignInResult.Failed;
        }

        private async Task<bool> IsTfaEnabled(IdentityUser user)
    => UserManager.SupportsUserTwoFactor &&
    await UserManager.GetTwoFactorEnabledAsync(user) &&
    (await UserManager.GetValidTwoFactorProvidersAsync(user)).Count > 0;




    }
}

然后您可以修改 startup.cs 的 ConfigureServices 以使用自定义的 SignInManager .AddSignInManager&lt;ApplicationSignInManager&gt;()

        services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>().AddSignInManager<ApplicationSignInManager>();

【讨论】:

  • 不,抱歉,不能接受这个作为答案。我不提倡任何人覆盖安全代码。现在只玩日志级别
  • 据我所知,SignInManager 源类是公共的,而 CheckPasswordSignInAsync 方法是虚拟的,这意味着您可以覆盖这些代码,而我所做的只是修改一行 Logger.LogError。如果您不想使用这种方式,我们无法使用其他方式修改记录器类型。
【解决方案2】:

这样做的一个好方法是调整logging 并在之后过滤日志。我不建议覆盖 .net 安全代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2016-09-15
    • 2014-09-01
    • 2023-04-11
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多