2

我们的安全团队要求我不要plain text在我的登录页面中提交密码,但我们使用的是 HTTPS。所以我认为我需要在提交之前进行客户端加密,我搜索了解决方案并决定实施jCryption
然而,在几个谷歌发现这个之后,这里展示的例子是 PHP/python 。我做了链接中解释的任何事情,但我不知道如何检索用户在表单中提交的表单数据。

我的登录回发操作的屏幕截图

key我只在我的登录回发操作中看到一个返回,并且LoginModel应该包含用户名,密码为空。

登录.cshtml

@model Portal.Model.Membership.LoginModel
@using jCryption

@{
    Layout = null;
    jCryption.HandleRequest(Request);
}
<html>
<head>
    <script src="~/Assets/global/plugins/jquery.min.js" type="text/javascript"></script>
    <script src="~/Assets/global/plugins/jquery-migrate.min.js" type="text/javascript"></script>
    @jCryption.RenderScriptFor("form", src: @Url.Content("~/Assets/admin/scripts/jquery.jcryption.3.1.0.js"))
</head>
<body>
@using (Html.BeginForm(null, null, FormMethod.Post, new { @autocomplete = "off" }))
{
    <div class="form-body">
        <div class="form-group">
            @Html.LabelFor(x => x.Username, new { @class = "placeholder" })
            @Html.TextBoxFor(x => x.Username, new { @class = "form-input", autocomplete = "off" })
            <span></span>
        </div>


        <div class="form-group">
            @Html.LabelFor(x => x.Password, new { @class = "placeholder" })
            @Html.PasswordFor(x => x.Password, new { @class = "form-input", autocomplete = "off" })
            <span></span>
        </div>
    </div>

    <div class="form-group">
        <button id="btnLogin">Login</button>
    </div>
}
</body>
<!-- END BODY -->
</html>

更新 我在登录后操作上设置了断点,它弹出两次,一个是key,另一个是jCryption提交后的jCryption表单数据

4

2 回答 2

0

对于 MVC 5,您需要稍作调整。在 login.cshtml

    @using jCryption
    @{
        jCryption.HandleRequest(Request);
    } 

    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")

        <script src="/Scripts/jquery.jcryption.3.1.0.mod.js"></script>     

        <script type="text/javascript">

        // tweak for compatibility with jquery.validate

            (function($){
                var _jCryption = $.jCryption;
                var jCryptionMod = function(el,options){
                    var form = $(el), hasValidator = !!form.data('validator');
                    if (hasValidator){
                        var v = form.validate();
                        var prev_handler = v.settings.submitHandler;
                        v.settings.submitHandler = function (_form, event) {
                            if( prev_handler ) prev_handler.apply(this, arguments);
                            var form = $(_form);
                            if (!form.hasClass('jc-before-submit')) {
                                v.settings.submitHandler = prev_handler;
                                form.addClass('jc-before-submit');
                                setTimeout( function(){ form.trigger('_jc_submit', event); }, 100 );
                            }
                        };

                        _jCryption.call(this, form, $.extend(options, {
                            submitElement: form,
                            submitEvent: '_jc_submit',
                            beforeEncryption: function(){
                                form.removeAttr('disabled');// form element hack ( IE11 )
                                return true;
                            }
                        }));
                    } else {
                        return _jCryption.call(this,el,options);
                    }
                }
                $.extend(jCryptionMod, $.jCryption);
                $.jCryption = jCryptionMod;
            })(jQuery);
        </script> 

        <script type="text/javascript">
            $(document).ready(function(){
                var form = $('form');
                var url = form.attr('action') || '/Account/Login';
                form.jCryption({
                    getKeysURL: url + '?getPublicKey=true',
                    handshakeURL: url + '?handshake=true'
                });
            });
        </script>       
    }

AccountController,您应该遵循 JakeJP 的文档(完全相同的代码)。

在 IE F12 开发人员工具(网络--> 转到详细视图--> 请求正文)中,它显示 &jCryptionKey= 但不显示 &UserName= 和 &Password=。

于 2015-04-17T04:35:53.890 回答
0

您的操作方法中缺少该jCryptionHandler属性。该属性负责处理 jCryption 握手和解密。

[jCryptionHandler]  
public ActionResult Login(LoginModel model)
{
    return View();
}
于 2015-10-20T00:50:59.933 回答