How can I get browser to prompt to save password?

前端 未结 20 1446
面向向阳花
面向向阳花 2020-11-22 16:20

Hey, I\'m working on a web app that has a login dialog that works like this:

  1. User clicks \"login\"
  2. Login form HTML is loaded with AJAX and displayed i
20条回答
  •  执笔经年
    2020-11-22 16:46

    The following code is tested on

    • Chrome 39.0.2171.99m: WORKING
    • Android Chrome 39.0.2171.93: WORKING
    • Android stock-browser (Android 4.4): NOT WORKING
    • Internet Explorer 5+ (emulated): WORKING
    • Internet Explorer 11.0.9600.17498 / Update-Version: 11.0.15: WORKING
    • Firefox 35.0: WORKING

    JS-Fiddle:
    http://jsfiddle.net/ocozggqu/

    Post-code:

    // modified post-code from https://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit
    function post(path, params, method)
    {
        method = method || "post"; // Set method to post by default if not specified.
    
        // The rest of this code assumes you are not using a library.
        // It can be made less wordy if you use one.
    
        var form = document.createElement("form");
        form.id = "dynamicform" + Math.random();
        form.setAttribute("method", method);
        form.setAttribute("action", path);
        form.setAttribute("style", "display: none");
        // Internet Explorer needs this
        form.setAttribute("onsubmit", "window.external.AutoCompleteSaveForm(document.getElementById('" + form.id + "'))");
    
        for (var key in params)
        {
            if (params.hasOwnProperty(key))
            {
                var hiddenField = document.createElement("input");
                // Internet Explorer needs a "password"-field to show the store-password-dialog
                hiddenField.setAttribute("type", key == "password" ? "password" : "text");
                hiddenField.setAttribute("name", key);
                hiddenField.setAttribute("value", params[key]);
    
                form.appendChild(hiddenField);
            }
        }
    
        var submitButton = document.createElement("input");
        submitButton.setAttribute("type", "submit");
    
        form.appendChild(submitButton);
    
        document.body.appendChild(form);
    
        //form.submit(); does not work on Internet Explorer
        submitButton.click(); // "click" on submit-button needed for Internet Explorer
    }
    

    Remarks

    • For dynamic login-forms a call to window.external.AutoCompleteSaveForm is needed
    • Internet Explorer need a "password"-field to show the store-password-dialog
    • Internet Explorer seems to require a click on submit-button (even if it's a fake click)

    Here is a sample ajax login-code:

    function login(username, password, remember, redirectUrl)
    {
        // "account/login" sets a cookie if successful
        return $.postJSON("account/login", {
            username: username,
            password: password,
            remember: remember,
            returnUrl: redirectUrl
        })
        .done(function ()
        {
            // login succeeded, issue a manual page-redirect to show the store-password-dialog
            post(
                redirectUrl,
                {
                    username: username,
                    password: password,
                    remember: remember,
                    returnUrl: redirectUrl
                },
                "post");
        })
        .fail(function ()
        {
            // show error
        });
    };
    

    Remarks

    • "account/login" sets a cookie if successful
    • Page-redirect ("manually" initiated by js-code) seems to be required. I also tested an iframe-post, but I was not successful with that.

提交回复
热议问题