首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在asp.net窗体身份验证中启用多次登录尝试?

如何在asp.net窗体身份验证中启用多次登录尝试?
EN

Stack Overflow用户
提问于 2015-06-15 11:37:50
回答 2查看 350关注 0票数 2

我有一个带有表单身份验证的MVC项目。

基本上,它工作得很好:用户希望使用Authorize-Attribute访问控制器,如果没有经过身份验证,就会被重定向到登录页面。在重定向时,参数returnUrl也会被转发。

但是,如果登录的第一次尝试失败,返回页面将不再工作。我认为returnUrl在第一次尝试之后被更改为帐户控制器,因为它在当前登录尝试之前使用最后一个页面。因此,身份验证似乎仍然有效,但用户仍然停留在登录页面上,不会被重定向到以前的页面。

是否有办法防止returnUrl在第一次登录失败后被更改?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 11:54:29

因为您的ViewBag的returnUrl在回发后设置为null,

只是简单地说

代码语言:javascript
复制
    ViewBag.ReturnUrl = returnUrl;

在你的HttpPost动词Login动作的开头。

票数 0
EN

Stack Overflow用户

发布于 2015-06-15 14:45:42

在开始阅读之前:我在这里使用实体框架代码-优先方法。userService是我的UserDBCotext类对象。UserDbContect是上下文类。

下面是简单的代码。您可以将它用于LogIn操作。也适用于多个登录。

主计长行动:

代码语言:javascript
复制
public ActionResult LogIn()
        {
            return View(new ForLogIn());
        }

        [HttpPost]
        public ActionResult LogIn(ForLogIn user)
        {
            try 
            {
                if(ModelState.IsValid)
                {
                    var loggedUser=userService.Users.FirstOrDefault(i=>i.UserName==user.UserName && i.UserPassword==user.UserPassword);
                    if(loggedUser!=null)
                    {
                        FormsAuthentication.SetAuthCookie(user.UserName, false);
                        return View("LoggedIn", loggedUser);
                    }
                    else
                    {
                        ModelState.AddModelError("", "Username or password is incorrect, please try again");
                        return View(user);
                    }
                }
                else
                {
                    return View(user);
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
                return View(user);
            }
        }

带有脚手架的LogIN视图:

代码语言:javascript
复制
@model DataAccessLayer.Models.ForLogIn

@{
    ViewBag.Title = "LogIn";
}

<h2>LogIn</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>User</h4>
        <hr />
        @Html.ValidationSummary()

        <div class="form-group">
            @Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserName)
                @Html.ValidationMessageFor(model => model.UserName)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UserPassword, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.PasswordFor(model => model.UserPassword)
                @Html.ValidationMessageFor(model => model.UserPassword)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Log In" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

没有什么特别的,只有LoggedIn视图。您可以跳过它,创建您想要的任何视图:

代码语言:javascript
复制
@model DataAccessLayer.Models.User

@{
    ViewBag.Title = "LoggedIn";
}

<h2>Congratulations @Model.UserName</h2>
<h3>You've Logged In successfully, please choose option below</h3>
<p>@Html.ActionLink("Home", "Index", "Home")</p>
<p>@Html.ActionLink("Start Test", "Start", "Test")</p>

最后,我的用户类:

代码语言:javascript
复制
public class User
    {
        public int ID { get; set; }

        [Required(ErrorMessage = "Please enter you name")]
        [Display(Name = "Name")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "Please enter you E-mail")]
        [Display(Name = "E-mail")]
        public string Email { get; set; }

        [Required(ErrorMessage = "Please enter you Password")]
        [Display(Name = "Password")]
        [StringLength(50, MinimumLength = 6, ErrorMessage = "Password minimum length is 6 characters, maximum-50")]
        public string UserPassword { get; set; }

        [Required(ErrorMessage = "Please repeat your password")]
        [Display(Name = "Repeate Password")]
        [StringLength(50, MinimumLength = 6, ErrorMessage = "Repeated password minimum length is 6 characters, maximum-50")]
        public string UserRepeatPassword { get; set; }

        [Display(Name="Is Active")]
        public bool IsActive { get; set; }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30844214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档