gpt4 book ai didi

asp.net-identity - ASP.Net Identity Core 中的AllowOnlyAlphanumericUserNames 和UserValidator 属性在哪里?

转载 作者:行者123 更新时间:2023-12-02 03:17:16 31 4
gpt4 key购买 nike

我正在尝试在我的项目中设置 ASP.Net Identity Core。问题是我们将使用 Windows 身份验证而不是表单例份验证。通过在 iisSettings 的 launch.settings 中设置这些属性,我可以让授权标签在家庭 Controller 上工作:

"windowsAuthentication": true,
"anonymousAuthentication": false,

现在在我的标题中,我使用以下命令通过布局文件看到我的用户名:

@User.Identity.Name

所以我的标题右上角的用户名如下所示:

[domain\username\]

现在授权标签可以工作了。如果我关闭 Windows 身份验证并返回匿名身份验证,我将获得该页面的未经授权状态。如果返回 Windows 身份验证,我可以再次看到主页/索引页面。与身份还没有太大关系。

现在我尝试创建一个创建用户页面,该页面最终将真正成为 Active Directory 页面中的“添加用户”。所以我尝试以这种格式存储用户名:

domain\username

这是我的创建代码:

[HttpPost]
public async Task<IActionResult> CreateUser(CreateUserViewModel createUserModel)
{
if (ModelState.IsValid)
{
AppUser user = new AppUser
{
UserName = createUserModel.Name,
Email = createUserModel.Email
};
IdentityResult result
= await _userManager.CreateAsync(user, createUserModel.Password);

if (result.Succeeded)
{
return RedirectToAction("Index");
}
else
{
foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError("", error.Description);
}
}
}
return View(createUserModel);
}

但是我收到了这条消息:

User name 'domain\username' is invalid, can only contain letters or digits.

因此,通过阅读,我不断发现您可以使用 UserManager 之外的这些属性来处理此问题:

AllowOnlyAlphanumericUserNames
UserValidator

但是这些属性在 Identity Core 中似乎不存在。这是真的?如何在 Core 中解决这个问题?非常卡住。无法从默认实现中找到该属性,或者如果我尝试创建自定义用户验证器。

<小时/>

更新1:

我在startup.cs中注册我的自定义用户验证器

services.AddTransient<IUserValidator<AppUser>, CustomUserValidator>();

这是我的第一次尝试:

public class CustomUserValidator : UserValidator<AppUser>
{
public async override Task<IdentityResult> ValidateAsync(
UserManager<AppUser> manager, AppUser user)
{
IdentityResult result = await base.ValidateAsync(manager, user);
// Allow '\' char for active directory userNames: domain\userName.
// Default does not allow special chars.

foreach (IdentityError error in result.Errors)
{
if (error.Code == "InvalidUserName")
{
((List<IdentityError>)result.Errors).Remove(error);
}
}

return result.Errors.Count() == 0 ? IdentityResult.Success
: IdentityResult.Failed(result.Errors.ToArray());
}
}

在 foreach 结束时,错误计数确实为 0。但是随后返回被跳过,它跳回到我的帐户 Controller 中的调用,错误仍然存​​在:

IdentityResult result 
= await _userManager.CreateAsync(user, createUserModel.Password);

所以我的错误仍然在模型状态中返回,如下所示:

if (result.Succeeded)
{
return RedirectToAction("Index");
}
else
{
foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError("", error.Description);
}
}

这是完整的创建帖子:

    [HttpPost]
public async Task<IActionResult> CreateUser(CreateUserViewModel createUserModel)
{
if (ModelState.IsValid)
{
AppUser user = new AppUser
{
UserName = createUserModel.Name,
Email = createUserModel.Email
};
IdentityResult result
= await _userManager.CreateAsync(user, createUserModel.Password);

if (result.Succeeded)
{
return RedirectToAction("Index");
}
else
{
foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError("", error.Description);
}
}
}
return View(createUserModel);
}

接下来我尝试一个更简单版本的自定义用户验证器,如下所示:

public class CustomUserValidator : IUserValidator<AppUser>
{
public Task<IdentityResult> ValidateAsync(
UserManager<AppUser> manager, AppUser user)
{
return Task.FromResult(IdentityResult.Success);
}
}

什么都不要做。只需返回强制成功即可。这一切都会完成,但当它返回调用时,结果仍然是 IdentityResult.Failure 并显示“InvalideCode” 您的用户名中不能包含特殊字符。

这真是太让我气愤了。没有理由这样做。这应该有效。为什么这如此不灵活且不可行?

这让我在工作中使用 Core 显得非常愚蠢,而且我可能会因为这个 fbs 被解雇。

更新2:

我尝试将其放入 Controller 中,但仍然不起作用。

    [HttpPost]
public async Task<IActionResult> CreateUser(CreateUserViewModel createUserModel)
{
if (ModelState.IsValid)
{
AppUser user = new AppUser
{
UserName = createUserModel.Name,
Email = createUserModel.Email
};
IdentityResult result
= await _userManager.CreateAsync(user, createUserModel.Password);

foreach (IdentityError error in result.Errors)
{
if (error.Code == "InvalidUserName")
{
((List<IdentityError>)result.Errors).Remove(error);
}
}
if (result.Errors.Count() == 0)
{
result = IdentityResult.Success;
}

if (result.Succeeded)
{
return RedirectToAction("Index");
}
else
{
foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError("", error.Description);
}
}
}
return View(createUserModel);
}

它会在以下时间后立即启动:

IdentityResult result 
= await _userManager.CreateAsync(user, createUserModel.Password);

并给出 500 错误。

最佳答案

要更改用户名中允许使用的字符,请在您传递给 AddIdentity 的选项中添加/更新此行。 StartUp 中的函数(假设您这样做)类(class)。下面...

options.User.AllowedUserNameCharacters = "";

或者

options.User.AllowedUserNameCharacters = null;

将其设置为空字符串或 null如果您想跳过用户名验证。

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
...

services.AddIdentity<YourUser, YourRole>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = true;
options.User.AllowedUserNameCharacters = null; // HERE!
options.User.RequireUniqueEmail = true;
...
})
}

希望这对您有所帮助。

UserValidator.cs

IdentityConfig.cs

关于asp.net-identity - ASP.Net Identity Core 中的AllowOnlyAlphanumericUserNames 和UserValidator 属性在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748332/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com