我的中间件方法目前有一个可配置的选项"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);
}
到目前为止,这已经工作如预期,但我的问题是
- 有没有其他更好的方法来处理这种情况?
- 我如何实现这一点有任何安全问题吗?
我如何实现这一点有任何安全问题吗?
当前的方法是不断更改全局应用程序选项,该选项应该只在启动时设置。
有没有其他更好的方法来处理这种情况?
重写应该只检查所需的条件。在这个例子中是
只有在提供电话号码时才会启动
例如
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);
}
假设在启动时基于从配置
中检索到的confirmedNumberRequiredAlways
配置base.Options.SignIn.RequireConfirmedPhoneNumber