Identity email with dash in Asp.Net Identity

别说谁变了你拦得住时间么 提交于 2019-12-18 14:14:55

问题


I am using ASP.NET MVC identity and when I add an email of the form test-name@testing.com I get the validation error message

User name test-name@testing.com is invalid, can only contain letters or digits.

How can I change the validation so that it will allow the email to be accepted?

My cshtml is:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { role = "form" }))
        {
            @Html.AntiForgeryToken()

            <div class="reg-header">
                <h2>Register</h2>
            </div>
            <fieldset>
                @if (ViewBag.IsRegister)
                {
                    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                }
                <div class="margin-bottom-20">
                    @Html.LabelFor(m => m.RegisterViewModel.FirstName)<br />
                    <div class="input-group">
                        <span class="input-group-addon"><i class="fa fa-user"></i></span>
                        @Html.TextBoxFor(m => m.RegisterViewModel.FirstName, new { @class = "form-control" })
                    </div>
                    @Html.ValidationMessageFor(m => m.RegisterViewModel.FirstName, "", new { @class = "text-danger" })
                </div>

                <div class="margin-bottom-20">
                    @Html.LabelFor(m => m.RegisterViewModel.LastName)<br />
                    <div class="input-group">
                        <span class="input-group-addon"><i class="fa fa-user"></i></span>
                        @Html.TextBoxFor(m => m.RegisterViewModel.LastName, new { @class = "form-control" })
                    </div>
                    @Html.ValidationMessageFor(m => m.RegisterViewModel.LastName, "", new { @class = "text-danger" })
                </div>

                <div class="margin-bottom-20">
                    @Html.LabelFor(m => m.RegisterViewModel.Email)<br />
                    <div class="input-group">
                        <span class="input-group-addon"><i class="fa fa-user"></i></span>
                        @Html.TextBoxFor(m => m.RegisterViewModel.Email, new { @class = "form-control" })
                    </div>
                    @Html.ValidationMessageFor(m => m.RegisterViewModel.Email, "", new { @class = "text-danger" })
                </div>

                <div class="margin-bottom-20">
                    @Html.LabelFor(m => m.RegisterViewModel.Password)<br />
                    <div class="input-group ">
                        <span class="input-group-addon"><i class="fa fa-lock"></i></span>
                        @Html.PasswordFor(m => m.RegisterViewModel.Password, new { @class = "form-control" })

                    </div>
                    @Html.ValidationMessageFor(m => m.RegisterViewModel.Password, "", new { @class = "text-danger" })
                </div>

                <div class="margin-bottom-20">
                    @Html.LabelFor(m => m.RegisterViewModel.ConfirmPassword)<br />
                    <div class="input-group">
                        <span class="input-group-addon"><i class="fa fa-lock"></i></span>
                        @Html.PasswordFor(m => m.RegisterViewModel.ConfirmPassword, new { @class = "form-control" })
                        <div class="clear"></div>
                    </div>
                    @Html.ValidationMessageFor(m => m.RegisterViewModel.ConfirmPassword, "", new { @class = "text-danger" })
                </div>
                <div class="row">

                    <div class="col-md-12">
                        <button class="btn-u" type="submit" name="command" value="Register">Register</button>
                    </div>
                </div>
            </fieldset>
        }

This is my controller:

                RegisterViewModel model = login.RegisterViewModel;
                var user = new ApplicationUser() { UserName = model.Email, FirstName = model.FirstName, LastName = model.LastName, UserRole = UserRole.Rider };
                IdentityResult result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInAsync(user, isPersistent: false);

                    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                    // Send an email with this link
                    // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                    return RedirectToLocal(returnUrl);
                    //return RedirectToAction("Index", "Home");
                }
                else
                {
                    ViewBag.ReturnUrl = returnUrl;
                    AddErrors(result);
                }

回答1:


The default UserValidator that is used in the UserManager has a property AllowOnlyAlphanumericUserNames that is set to true.. you will need to override this to allow the special characters. A possible solution would be to override the UserManager with your own implementation like so.

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
    {
        this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
}

public class ApplicationUser : IdentityUser
{
    //Custom Properties etc.
}



回答2:


Thanks for the assistance on this.

I actually sorted this out by putting the following in the account controller

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("One");
        userManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"));
        UserManager = userManager;

        UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager)
        {
            AllowOnlyAlphanumericUserNames = false
        };
    }


来源:https://stackoverflow.com/questions/26726750/identity-email-with-dash-in-asp-net-identity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!