簡體   English   中英

ASP.Net Identity Core中的AllowOnlyAlphanumericUserNames和UserValidator屬性在哪里?

[英]Where are the AllowOnlyAlphanumericUserNames and UserValidator properites in ASP.Net Identity Core?

我正在嘗試在我的項目中設置ASP.Net Identity Core。 問題是我們將使用Windows身份驗證而不是表單身份驗證。 通過在iisSettings的launch.settings中設置這些屬性,我可以讓Authorize標簽在home控制器上工作:

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

所以現在在我的標題中,我通過我的布局文件看到我的用戶名:

@User.Identity.Name

所以我在標題右上角的用戶名如下所示:

[domain\username\]

所以現在授權標簽工作。 如果我關閉Windows身份驗證並返回匿名身份驗證,我將獲得該頁面的未授權狀態。 如果回到Windows身份驗證,我可以再次看到主頁/索引頁面。 尚未與身份有多大關系。

現在我嘗試創建一個創建用戶頁面,最終真正成為Active Directory頁面的“添加用戶”。 所以我試圖以這種格式存儲UserName:

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.但是然后跳過返回並且它跳回到我的帳戶控制器中的調用並且錯誤仍然存​​在:

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);
     }
 }

這是完整的創建POST:

    [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);
    }
}

什么都不做 只需返回強制成功。 這一切都會通過但是當它返回到調用時,結果仍然是帶有“InvalideCode”的IdentityResult.Failure。用戶名中不能包含特殊字符。

這是踢我的屁股。 沒理由這個。 這應該工作。 為什么這非常不靈活且不可行?

這讓我在使用Core時看起來非常愚蠢,我可能會被解雇這個fbs。

更新2:

我試着把它放在控制器中,它仍然無法正常工作。

    [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錯誤。

要更改使用名稱中允許的字符,請在StartUp類中傳遞給AddIdentity函數的選項中添加/更新此行(假設您這樣做)。 下面...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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