Base solution for your next web application
Open Closed

Password Complexity Setting not working in Register Page #1707


User avatar
0
moustafa created

Hello i noticed that password complexity setting not working in Register page although property

public PasswordComplexitySetting PasswordComplexitySetting { get; set; }

are defined in RegisterViewModel but still not working how can i fix it ?


8 Answer(s)
  • User Avatar
    0
    ismcagdas created
    Support Team

    Hi,

    Do you have a javascript error on browser console ? And, did you implemented necessary changes for Register.cshtml and Register.js ?

    Last thing, can you run the command "window.passwordComplexitySetting" in browser's developer console and share it's value ?

  • User Avatar
    0
    moustafa created

    i have no errors in console window of course i did all the necessary changes in Register.cshtml and Register.js actually i working on the last version v.12.0

    this object returned when execute the command "window.passwordComplexitySetting"

    Object 
    MaxLength:25
    MinLength:6
    UseLowerCaseLetters:true
    UseNumbers:true
    UsePunctuations:false
    UseUpperCaseLetters:false
    __proto__:Object
    

    by the way these are not the values saved in my database

    Object 
    MaxLength:25
    MinLength:8
    UseLowerCaseLetters:true
    UseNumbers:true
    UsePunctuations:false
    UseUpperCaseLetters:true
    __proto__:Object
    

    and its working just fine in reset password page and user's settings

  • User Avatar
    0
    ismcagdas created
    Support Team

    Hi,

    Can you share your Register.js and Register.cshtml. Maybe you are missing something. A seond eye might catch it, if there is something of course.

  • User Avatar
    0
    moustafa created

    Hi, thank you for coming back

    Register.cshtml

    @model Umbrella.Web.Models.Account.RegisterViewModel
    @using System.Web.Script.Serialization
    @using Abp.Extensions
    @using Abp.Web.Mvc.Extensions
    @using Umbrella.MultiTenancy
    @using Recaptcha.Web
    @using Recaptcha.Web.Mvc
    @section Scripts
    {
        <script>
            window.passwordComplexitySetting = @(new JavaScriptSerializer().Serialize(Model.PasswordComplexitySetting).Replace("\"", ""));
        </script>
        @Html.IncludeScript("~/Views/Account/Register.js")
    }
    <form class="register-form" action="@Url.Action("Register")" method="post">
    
        <h3>@L("SignUp")</h3>
    
        @if (@ViewBag.ErrorMessage != null)
        {
            <div class="alert alert-danger">
                <i class="fa fa-warning"></i> @ViewBag.ErrorMessage
            </div>
        }
    
        @Html.AntiForgeryToken()
    
        @if (ViewBag.IsMultiTenancyEnabled)
        {
            if (Model.TenancyName.IsNullOrEmpty())
            {
                <p class="hint hide">
                    @L("TenantInformations")
                </p>
                <div class="form-group hide">
                    <label class="control-label visible-ie8 visible-ie9">@L("TenancyName")</label>
                    <input class="form-control placeholder-no-fix input-ltr" type="text" placeholder="@L("TenancyName")" name="TenancyName" value="@(Model.TenancyName ?? "Default")" required maxlength="@Tenant.MaxTenancyNameLength" />
                </div>
            }
            else
            {
                <input type="hidden" name="TenancyName" value="@Model.TenancyName" />
            }
        }
    
        <input type="hidden" name="IsExternalLogin" value="@Model.IsExternalLogin.ToString()" />
    
        <p class="hint">
            @L("PersonalInformations")
        </p>
        <div class="form-group">
            <label class="control-label visible-ie8 visible-ie9">@L("QuadName")</label>
            <input class="form-control placeholder-no-fix" type="text" placeholder="@L("QuadName")" name="Name" required value="@Model.Name" maxlength="@Umbrella.UmbrellaConsts.MaxNameLength" autocomplete="off" onkeypress="return checkCharacters(event,'ar');" onpaste="return false;"/>
            @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
        </div>
        <div class="form-group">
            <label class="control-label visible-ie8 visible-ie9">@L("Mobile")</label>
            <input class="form-control placeholder-no-fix" type="text" placeholder="@L("Mobile")" name="Mobile" required value="@Model.Mobile" maxlength="@Umbrella.UmbrellaConsts.MaxMobileLength" data-val-regex="@L("InvalidMobile")" data-val-regex-pattern="05(0|3|5|4|6|8|9)[0-9]{7}" data-val="true" autocomplete="off" onkeypress="return checkNumbers(event)" onpaste="return false;"/>
            @Html.ValidationMessageFor(m => m.Mobile, "", new { @class = "text-danger" })
        </div>
        @*<div class="form-group">
                <label class="control-label visible-ie8 visible-ie9">@L("Surname")</label>
                <input class="form-control placeholder-no-fix" type="text" placeholder="@L("Surname")" name="Surname" required value="@Model.Surname" maxlength="@Umbrella.Authorization.Users.User.MaxSurnameLength" />
            </div>*@
        <div class="form-group">
            <label class="control-label visible-ie8 visible-ie9">@L("EmailAddress")</label>
            <input class="form-control placeholder-no-fix" type="email" placeholder="@L("EmailAddress")" name="EmailAddress" value="@Model.EmailAddress" maxlength="@Umbrella.Authorization.Users.User.MaxEmailAddressLength" autocomplete="off" onkeypress="return checkEnglishAndNumbersAtSymbol(event);" onpaste="return false;" />
            @Html.ValidationMessageFor(m => m.EmailAddress, "", new { @class = "text-danger" })
        </div>
    
        @if (!Model.IsExternalLogin)
        {
            <p class="hint">
                @L("AccountSettings")
            </p>
            <div class="form-group">
                <label class="control-label visible-ie8 visible-ie9">@L("IdentityNumber")</label>
                <input class="form-control placeholder-no-fix input-ltr" type="text" autocomplete="off" placeholder="@L("IdentityNumber")" name="UserName" value="@Model.UserName" required maxlength="@Umbrella.UmbrellaConsts.MaxIdentityLength" data-val-regex="@L("InvalidIdentityNumber")" data-val-regex-pattern="10[0-9]{8}" data-val="true" onkeypress="return checkNumbers(event)" onpaste="return false;"/>
                @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
            </div>
            <div class="form-group">
                <label class="control-label visible-ie8 visible-ie9">@L("Password")</label>
                <input class="form-control placeholder-no-fix" type="password" autocomplete="off" id="RegisterPassword" placeholder="@L("Password")" name="Password" required data-val="true" onpaste="return false;"/>
                @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
            </div>
            <div class="form-group">
                <label class="control-label visible-ie8 visible-ie9">@L("PasswordRepeat")</label>
                <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="@L("PasswordRepeat")" name="PasswordRepeat" required data-val="true" data-val-equalto-other="Password" data-val-equalto="@L("PasswordNotMatch")" onpaste="return false;"/>
                @Html.ValidationMessageFor(m => m.PasswordRepeat, "", new { @class = "text-danger" })
            </div>
        }
    
        @if (ViewBag.UseCaptcha)
        {
            <p class="hint">
                @L("Captha_Hint")
            </p>
            <div class="form-group margin-bottom-20">
                @Html.Recaptcha(theme: RecaptchaTheme.Red)
            </div>
        }
    
        <div class="form-actions">
            <a href="@Url.Action("Login","Account")"><button type="button" id="register-back-btn" class="btn btn-default">@L("Back")</button></a>&nbsp;
            <button type="submit" id="register-submit-btn" class="btn btn-primary uppercase">@L("Submit")</button>
        </div>
    </form>
    

    Register.js

    var CurrentPage = function () {
    
        jQuery.validator.addMethod("customUsername", function (value, element) {
            if (value === $('input[name="EmailAddress"]').val()) {
                return true;
            }
    
            return !$.validator.methods.email.apply(this, arguments);
        }, abp.localization.localize("RegisterFormUserNameInvalidMessage"));
    
        var _passwordComplexityHelper = new app.PasswordComplexityHelper();
    
        var handleRegister = function () {
    
            $('.register-form').validate({
                errorElement: 'span', //default input error message container
                errorClass: 'help-block', // default input error message class
                focusInvalid: false, // do not focus the last invalid input
                ignore: "",
                rules: {
                    PasswordRepeat: {
                        equalTo: "#RegisterPassword"
                    },
                    UserName: {
                        required: true,
                        customUsername: true
                    }
                },
    
                messages: {
    
                },
    
                invalidHandler: function (event, validator) {
    
                },
    
                highlight: function (element) {
                    $(element).closest('.form-group').addClass('has-error');
                },
    
                success: function (label) {
                    label.closest('.form-group').removeClass('has-error');
                    label.remove();
                },
    
                errorPlacement: function (error, element) {
                    if (element.closest('.input-icon').size() === 1) {
                        error.insertAfter(element.closest('.input-icon'));
                    } else {
                        error.insertAfter(element);
                    }
                },
    
                submitHandler: function (form) {
                    form.submit();
                }
            });
    
            $('.register-form input').keypress(function (e) {
                if (e.which == 13) {
                    if ($('.register-form').valid()) {
                        $('.register-form').submit();
                    }
                    return false;
                }
            });
    
            var $element = $('#RegisterPassword');
            _passwordComplexityHelper.setPasswordComplexityRules($element, window.passwordComplexitySetting);
        }
    
        return {
            init: function () {
                handleRegister();
            }
        };
    
    }();
    

    Note that i'm using jquery unobtrusive validation because i need ti use regex annotation in RegisterViewModel , as jquery validation will not show up validation message if i didn't add some attributes to Password Input

    RegisterViewModel

    public class RegisterViewModel : IValidatableObject
        {
            /// <summary>
            /// Not required for single-tenant applications.
            /// </summary>
            [StringLength(Tenant.MaxTenancyNameLength)]
            public string TenancyName { get; set; }
    
            [Required]
            [StringLength(UmbrellaConsts.MaxNameLength)]
            public string Name { get; set; }
    
            //[Required]
            [StringLength(UmbrellaConsts.MaxNameLength)]
            public string Surname { get; set; }
    
            [StringLength(User.MaxUserNameLength)]
            [RegularExpression("10[0-9]{8}")]
            public string UserName { get; set; }
    
            //[Required]
            [EmailAddress]
            [StringLength(User.MaxEmailAddressLength)]
            public string EmailAddress { get; set; }
            [Required]
            [StringLength(User.MaxPlainPasswordLength)]
            [DisableAuditing]
            public string Password { get; set; }
            [Required]
            [StringLength(User.MaxPlainPasswordLength)]
            [DisableAuditing]
            public string PasswordRepeat { get; set; }
    
            public bool IsExternalLogin { get; set; }
    
            public PasswordComplexitySetting PasswordComplexitySetting { get; set; }
    
            [Required]
            [StringLength(UmbrellaConsts.MaxMobileLength)]
            [RegularExpression("05(0|3|5|4|6|8|9)[0-9]{7}")]
            public string Mobile { get; set; }
            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (!UserName.IsNullOrEmpty())
                {
                    if (!UserName.Equals(EmailAddress) && new ValidationHelper().IsEmail(UserName))
                    {
                        yield return new ValidationResult("Username cannot be an email address unless it's same with your email address !");
                    }
                }
            }
    
        }
    

    by the way the same situation in reset password page but i didn't made any changes on that page , the validation show up tell me that password should contains small letter but it accept from me numbers only but if i set settings the password should contains both small and uppercase letter it works just fine Thank you for your concern

  • User Avatar
    0
    ismcagdas created
    Support Team

    Hi,

    I couldn't find the problem on your files. Can you send your project via email ?

  • User Avatar
    0
    moustafa created

    ok please provide me with your email or should i use this one <a href="mailto:[email protected]">[email protected]</a>

  • User Avatar
    0
    ismcagdas created
    Support Team

    Hi,

    Yes, please send to <a href="mailto:[email protected]">[email protected]</a>. Thanks.

  • User Avatar
    0
    moustafa created

    sent waiting for your response