【问题标题】:ASP NET Identity - conditionally check for RequireConfirmedPhoneNumberASP NET Identity - 有条件地检查 RequireConfirmedPhoneNumber
【发布时间】:2021-10-05 14:23:22
【问题描述】:

我的中间件方法目前有一个“IdentityOptions.SignIn.RequireConfirmedPhoneNumber”的可配置选项,这会导致CheckPasswordSignInAsync 方法在未确认电话号码时返回IsNotAllowed = true。这是意料之中的。

我希望将此检查 (RequireConfirmedPhoneNumber) 设置为有条件的,因此只有在提供电话号码时才会启动。

为此,我重写了CheckPasswordSignInAsync 方法:

public override async Task<SignInResult> CheckPasswordSignInAsync(ApplicationUser user, string password, bool lockoutOnFailure)
{
      bool confirmedNumberRequiredAlways = true; // comes from config
      bool confirmedNumberRequiredIfProvided = true; // comes from config

      base.Options.SignIn.RequireConfirmedPhoneNumber = confirmedNumberRequiredAlways
                                                                || confirmedNumberRequiredIfProvided && !string.IsNullOrWhiteSpace(user.PhoneNumber);

      return await base.CheckPasswordSignInAsync(user, password, lockoutOnFailure);
}

到目前为止,这已按预期工作,但我的问题是

  1. 是否有任何替代/更好的方法来处理这种情况?,
  2. 我的实现方式是否存在任何安全问题?

【问题讨论】:

  • 电话确认可以要求外部服务如twilio通过发送短信确认:twilio.com/docs/libraries/csharp-dotnet
  • @Chaodeng 我关心的不是“如何发送短信”,感谢分享链接,但它并没有真正解决我的问题

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


【解决方案1】:

我的实现方式是否存在任何安全问题?

当前的方法将不断更改仅应在启动时设置的全局应用程序选项。

是否有任何替代/更好的方法来处理这种情况?,

覆盖应该只检查所需的条件。在这种情况下是

只有在提供电话号码时才会启动。

例如

public override async Task<SignInResult> CheckPasswordSignInAsync(ApplicationUser user, string password, bool lockoutOnFailure) {
    bool confirmedNumberRequiredIfProvided = ... //from config;
    
    //pre sign in checking condition here
    if(!base.Options.SignIn.RequireConfirmedPhoneNumber
        && confirmedNumberRequiredIfProvided 
        && !string.IsNullOrWhiteSpace(user.PhoneNumber) 
        && !(await UserManager.IsPhoneNumberConfirmedAsync(user))) {
        //consider logging
        return SignInResult.NotAllowed;
    }
    
    return await base.CheckPasswordSignInAsync(user, password, lockoutOnFailure);
}

假设 base.Options.SignIn.RequireConfirmedPhoneNumber 在启动时根据从配置中检索到的 confirmedNumberRequiredAlways 进行配置

【讨论】:

  • confirmedNumberRequiredAlwaysconfirmedNumberRequiredIfProvided 是单向互斥的,它们可以同时是false。如果confirmedNumberRequiredAlwaystrue,那么忽略confirmedNumberRequiredIfProvided 参数并进行验证应该是安全的?
猜你喜欢
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2020-04-21
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多