locked
WebSecurity RRS feed

  • Question

  • User895691971 posted

    Hi,

    I just downloaded Starter Site. And this time in the Register.cshtml page I get an error. When I try to create Account the error that is shown is: Provider encountered an unknown error. 

    I replaced this code: 

    WebSecurity.CreateAccount(emaill, pas..);

    with this one: 

    WebSecurity.CreateUserAndAccount(email, pass..);

    Then the account was created. Everything went fine. Why is it so?

    Sunday, August 18, 2013 11:01 AM

Answers

All replies

  • User540310021 posted

    I just tried. There were no errors.

    Sunday, August 18, 2013 11:12 AM
  • User895691971 posted

    Well I did get an error. I will try it again!

    Sunday, August 18, 2013 11:13 AM
  • User895691971 posted

    You can have a look. 

    Sunday, August 18, 2013 11:16 AM
  • User540310021 posted

    Please post your Register code here. Lets see.

    Sunday, August 18, 2013 11:18 AM
  • User895691971 posted

    I deleted!

    Sunday, August 18, 2013 11:22 AM
  • User540310021 posted

    May be you might have not made the necessary changes to the below given method. Please check it. Mostly this is the reason why you got that provider error.

    InitializeDatabaseConnection
    

     

    Sunday, August 18, 2013 11:30 AM
  • User895691971 posted

    No no thats OK! Correct Email, correct userid. 

    Sunday, August 18, 2013 11:31 AM
  • User540310021 posted

    N what about your username?

    Sunday, August 18, 2013 11:57 AM
  • User895691971 posted

    Actually the string is as this: 

    WebSecurity.InitializeDatabaseConnection("StarterSite", "UserProfile", "UserId", "Email", autoCreateTables: true)

    I was able to create the Account using the second method. But using CreateAccount had some issues.

    Sunday, August 18, 2013 12:03 PM
  • User540310021 posted

    Show your UserProfile table. Is it the defualt UserProfile table or you have made some changes to it.

    Sunday, August 18, 2013 12:11 PM
  • User895691971 posted

    No the default one!

    Sunday, August 18, 2013 12:14 PM
  • User540310021 posted

    Ok. But the image which you have posted in this post has a Your Name textbox.

    Sunday, August 18, 2013 12:16 PM
  • User895691971 posted

    Yes, I added a new column name: Name. But that won't cause any trouble

    Sunday, August 18, 2013 12:18 PM
  • User540310021 posted

    For the Login Welcome message are you using the user Email or the Username of the user.

    Sunday, August 18, 2013 12:38 PM
  • User895691971 posted

    Its same. I get the basic: welcome, justin17862@gmail.com! 

    Sunday, August 18, 2013 12:39 PM
  • User-1496281956 posted

    Afzaal.Ahmad.Zeeshan

    Its same. I get the basic: welcome, justin17862@gmail.com! 

    I just tried it and it is working completely fine. 

    Here is C# code:

    @* Remove this section if you are using bundling *@
    @section Scripts {
        <script src="~/Scripts/jquery.validate.min.js"></script>
        <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    }
    
    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Register";
    
        // Initialize general page variables
        var email = "";
        var password = "";
        var confirmPassword = "";
    
        // Setup validation
        Validation.RequireField("email", "You must specify an email address.");
        Validation.RequireField("password", "Password cannot be blank.");
        Validation.Add("confirmPassword",
            Validator.EqualsTo("password", "Password and confirmation password do not match."));
        Validation.Add("password",
            Validator.StringLength(
                maxLength: Int32.MaxValue,
                minLength: 6,
                errorMessage: "Password must be at least 6 characters"));
    
        // If this is a POST request, validate and process data
        if (IsPost) {
            AntiForgery.Validate();
            email = Request.Form["email"];
            password = Request.Form["password"];
            confirmPassword = Request.Form["confirmPassword"];
    
            // Validate the user's captcha answer
            // if (!ReCaptcha.Validate("PRIVATE_KEY")) {
            //     ModelState.AddError("recaptcha", "Captcha response was not correct");
            // }
    
            // If all information is valid, create a new account
            if (Validation.IsValid()) {
                // Insert a new user into the database
                var db = Database.Open("StarterSite");
    
                // Check if user already exists
                var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) = LOWER(@0)", email);
                if (user == null) {
                    // Insert email into the profile table
                    db.Execute("INSERT INTO UserProfile (Email) VALUES (@0)", email);
    
                    // Create and associate a new entry in the membership database.
                    // If successful, continue processing the request
                    try {
                        bool requireEmailConfirmation = !WebMail.SmtpServer.IsEmpty();
                        var token = WebSecurity.CreateAccount(email, password, requireEmailConfirmation);
                        if (requireEmailConfirmation) {
                            var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
                            var confirmationUrl = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/Confirm?confirmationCode=" + HttpUtility.UrlEncode(token));
    
                            WebMail.Send(
                                to: email,
                                subject: "Please confirm your account",
                                body: "Your confirmation code is: " + token + ". Visit <a href=\"" + confirmationUrl + "\">" + confirmationUrl + "</a> to activate your account."
                            );
                        }
    
                        if (requireEmailConfirmation) {
                            // Thank the user for registering and let them know an email is on its way
                            Response.Redirect("~/Account/Thanks");
                        } else {
                            // Navigate back to the homepage and exit
                            WebSecurity.Login(email, password);
    
                            Response.Redirect("~/");
                        }
                    } catch (System.Web.Security.MembershipCreateUserException e) {
                        ModelState.AddFormError(e.Message);
                    }
                } else {
                    // User already exists
                    ModelState.AddFormError("Email address is already in use.");
                }
            }
        }
    }

    HTML

    <hgroup class="title">
        <h1>@Page.Title.</h1>
        <h2>Create a new account.</h2>
    </hgroup>
    
    <form method="post">
        @AntiForgery.GetHtml()
        @* If at least one validation error exists, notify the user *@
        @Html.ValidationSummary("Account creation was unsuccessful. Please correct the errors and try again.", excludeFieldErrors: true, htmlAttributes: null)
    
        <fieldset>
            <legend>Registration Form</legend>
            <ol>
                <li class="email">
                    <label for="email" @if(!ModelState.IsValidField("email")){<text>class="error-label"</text>}>Email address</label>
                    <input type="text" id="email" name="email" value="@email" @Validation.For("email") />
                    @* Write any email validation errors to the page *@
                    @Html.ValidationMessage("email")
                </li>
                <li class="password">
                    <label for="password" @if(!ModelState.IsValidField("password")) {<text>class="error-label"</text>}>Password</label>
                    <input type="password" id="password" name="password" @Validation.For("password") />
                    @* Write any password validation errors to the page *@
                    @Html.ValidationMessage("password")
                </li>
                <li class="confirm-password">
                    <label for="confirmPassword" @if(!ModelState.IsValidField("confirmPassword")) {<text>class="error-label"</text>}>Confirm password</label>
                    <input type="password" id="confirmPassword" name="confirmPassword" @Validation.For("confirmPassword") />
                    @* Write any password validation errors to the page *@
                    @Html.ValidationMessage("confirmPassword")
                </li>
                <li class="recaptcha">
                    <div class="message-info">
                        <p>
                            To enable CAPTCHA verification, <a href="http://go.microsoft.com/fwlink/?LinkId=204140">install the 
                            ASP.NET Web Helpers Library</a> and uncomment ReCaptcha.GetHtml and replace 'PUBLIC_KEY'
                            with your public key. At the top of this page, uncomment ReCaptcha. Validate and
                            replace 'PRIVATE_KEY' with your private key.
                            Register for reCAPTCHA keys at <a href="http://recaptcha.net">reCAPTCHA.net</a>.
                        </p>
                    </div>
                    @*
                    @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white")
                    @Html.ValidationMessage("recaptcha")
                    *@
                </li>
            </ol>
            <input type="submit" value="Register" />
        </fieldset>
    </form>

    I have not changed any of the _AppStart settings or anything just downloaded the template and started it and it worked fine. I think the issue might be the extra column. How are you storing the persons Name?

    CreateAccount only accepts 3 arguments. (Username, Password, ConfirmationToken) last ones optional. If you want to add aditional info use CreateUserAndAccount method.

    Sunday, August 18, 2013 1:10 PM
  • User895691971 posted

    @CriticalError, No actually I am just using INSERT INTO to save the name. I am not saving the Name anywhere else!

    Sunday, August 18, 2013 1:19 PM
  • User-1496281956 posted

    Just you use CreateUserAndAccount I don't see why you would insert data into the same row using different methods.

    Sunday, August 18, 2013 1:44 PM
  • User895691971 posted

    I was using this: 

    db.Execute("INSERT INTO UserProfile (Email, Name) VALUES (@0, @1)", email, name);
    
                    // Create and associate a new entry in the membership database.
                    // If successful, continue processing the request
                    try {
                        bool requireEmailConfirmation = !WebMail.SmtpServer.IsEmpty();
                        var token = WebSecurity.CreateAccount(email, password, requireEmailConfirmation);

    Is there any fault? 

    Sunday, August 18, 2013 1:49 PM
  • User-1496281956 posted

    Yes, your inserting the email and name then doing it again (inserting email) through WebSecurity.CreateAccount, that's causing an error. Your basically trying to insert the email into same row twice. Use the WebSecurity.CreateuserAndAccount method it will save you so much time..

    Sunday, August 18, 2013 1:56 PM
  • User895691971 posted

    Yes, your inserting the email and name then doing it again (inserting email) through WebSecurity.CreateAccount, that's causing an error. Your basically trying to insert the email into same row twice. Use the WebSecurity.CreateuserAndAccount method it will save you so much time..

    Why and how? What's the reason behind that?

    Sunday, August 18, 2013 2:06 PM
  • User-1496281956 posted

    Because that's the proper way to do it as the method is providded, plus you can easily add columns / data easily. 

    http://www.thecodingguys.net/reference/asp/websecurity-createuserandaccount

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Sunday, August 18, 2013 2:40 PM