none
MVC登陆验证码无法显示 RRS feed

  • 问题

  • 用了MVC 4 自带的Memebership模型,做了一点小的扩展。

    写了一个验证码生成的类,在别的页面用过了,没有问题。

    然后……

    在AccountController里添加代码如下:

    public ActionResult GetValidateCode()
            {
                Captcha vCode = new Captcha();
                byte[] bytes = vCode.GetCaptchaBytes();
                Session["ValidateCode"] = vCode.VerifyCodeText;
    
                return File(bytes, @"image/jpeg");
            }


    登录逻辑里判断PasswordFailuresSinceLastSuccess大于阀值(3)就显示验证码,扩展了LoginModel做判断:

    public class LoginModel
        {
            [Required(ErrorMessage="用户名不能为空")]
            [Display(Name = "用户名")]
            public string UserName { get; set; }
    
            [Required(ErrorMessage = "密码不能为空")]
            [DataType(DataType.Password)]
            [Display(Name = "密码")]
            public string Password { get; set; }
    
            [Display(Name = "下次自动登录")]
            public bool RememberMe { get; set; }
    
            [Display(Name="使用验证码")]
            public bool UseValidationCode { get; set; }
    
            [Display(Name="验证码")]
            public string ValidationCode { get; set; }
        }


    然后……View里增加了img标签用于显示验证码图片:

    if (Model != null)
                                {
                                    if (Model.UseValidationCode == true)
                                    {
                                <div class="form-group form-inline">
                                    <img id="valiImg" style="cursor: pointer;" src="/Account/GetValidateCode" alt="点击图片更换" />
                                    @Html.TextBoxFor(m => m.ValidationCode, new { @class = "form-control", placeholder = "验证码", required = "" })
                                </div>
                                    }
                                }

    JavaScript:

    $("#valiImg").click(function () {
        $(this).attr("src", "/Account/GetValidateCode?time=" + (new Date()).getTime());
    });

    time是以前代码用的,没改。在这里没用。

    问题出现了……连续登陆不成功后验证码显示为“X”,跟了一下,每次点击图片刷新的时候,JQuery会发出两个请求GET:http://localhost:1791/Account/GetValidateCode?time=1425145495329和

    http://localhost:1791/Account/Login?ReturnUrl=%2fAccount%2fGetValidateCode%3ftime%3d1425148093111&time=1425148093111

    报错

    Resource interpreted as Image but transferred with MIME type text/html。

    为毛会提交login啊?form action明明写的是FormMethod.Post的啊,对HTML一知半解,求赐教。

    returnUrl也被自动加到请求字符串里了,返回的是个text/html而不是image/Jpeg,GetValidateCode下断,点击验证码刷新根本没有请求到这个Action上啊……倒是直接跑到Login去了……

    在MVC默认membership下编写图形验证码到底应该怎么做?Ajax去拿图片?把img标签移出form避免提交?还是怎么办?



    powered by david.

    2015年2月28日 18:35

全部回复

  • 您好,

    根据您的错误信息,问题应该是出在验证这块,而不是验证码。建议您先检测下是否通过验证,当你提交获取图片时。

    我建议可以尝试该链接:

    http://www.stefanprodan.com/2012/01/user-friendly-captcha-for-asp-net-mvc/

    2015年3月2日 1:40
  • Thanks for reply.

    呃,可能是我没有描述清问题。

    首先,验证码在其他地方的应用没问题,包括评论之类的地方。

    现在有问题的只有在Login Action,您给的链接我看了一下,不是很符合我现在的情况。我重新跟了一下,图片如下:

    如图,login.validate.js请求了/Account/GetValidateCode,然后服务器返回了302,302应该是“资源存在,但是位置转移”的意思吧?然后服务器给出了资源现在的地址:Login?ReturnUrl=%2fAccount%2fGetValidateCode,我不太明白的是:

    我用JQuery请求/Account/GetValidateCode,为什么被重定向到Login操作?是Web.config里的配置?

    我本意是在GetValidateCode里返回FileContent,结果被重定向到Login操作,“GetValidateCode”成了RequestString,肯定被Login无视然后返回text/html MIME……


    powered by david.

    2015年3月2日 14:29
  • AccountController 是不是设为必须要登录才能访问

    http://feiyun0112.cnblogs.com/

    2015年3月4日 6:26
    版主
  • 你好,

    是的,当你注册或者登录时,就会执行AccountController里面的Action

    2015年3月10日 6:56