asp.net mvc 登陆及用户角色验证

使用asp.net mvc 实现登陆及角色验证。

我最进想要实现对网站登陆者的权限管理问题,不同角色的用户访问页面收到权限的限制。然而因为建立的是空项目,所以只能手动实现角色管理的功能。

基本的思想就是重载AuthorizeAttribute特性标签,让重载的类继承ActioFilterAttribute类来实现个性的角色验证标签。

而登陆controller的书写主要就是从数据库中查出用户信息并把登陆信息用ticket加密保存在cookie里。

下面这段代码是登陆的控制器代码

namespace AccessControlSystem.Controllers
{
    public class AccessController : Controller
    {

        private AccessControlContext db = new AccessControlContext();

        [HttpGet]
        public ActionResult login()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult login(Login login)
        {
            var users = db.Users.Where(a => a.Name == login.UserName);
            if (!users.Any())
                return View();
            User user = users.First();
            var cards = db.Cards.Where(a => a.User_id == user.Id);
            Card card = cards.First();
            if(login.Password=="123"&&card.Privilege==2)
            {
                FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(
                    1,
                    login.UserName,
                    DateTime.Now,
                    DateTime.Now.AddMinutes(20),
                    false,
                    "admin"
                   );
                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(Ticket));
                cookie.HttpOnly = true;
                HttpContext.Response.Cookies.Add(cookie);
                return RedirectToAction("../DataBase/SelectUser");
            }
            return RedirectToAction("login");

        }
    }
}

使用[HttpPost]来提交表单,其中login只用一个变量,其实还可以加一个string returnUrl的变量使用Redirect()方法重定向到之前不具有权限的页面。

上面这段代码的核心部分是if中的代码,FormsAuthenticationTicket.ticket是我们要用来加密的票据,其中较重要的是login.UserName,和"admin"分别存放在ticket的name,userData中。

然后将加密(FormsAuthentication.Encrypt(Ticket))后的票据存在cookie的value中。

下面这段代码是对于AuthorizeAttribute的重载

namespace AccessControlSystem.Controllers
{
    public class AuthenticationAttribute:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
         {
            string role = "";
            var cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie != null)
            {
                var ticket = FormsAuthentication.Decrypt(cookie.Value);
                role = ticket.UserData;
            }
            if (role.Length==0||role!="admin")
            {
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Access", action = "login" }));
            }
            base.OnActionExecuting(filterContext);
        }

    }
}

这段代码中我们从filterContext中读取cookie的值,让后通过FormsAuthentication.Decrypt(cookie.Value)解密出票据信息,票据中的userData存放了我们用户的权限。

定义完此类之后我们就可以在其他方法之前添加[Authentication]特性标签来筛选用户的权限,在此实例中只有拥有“admin”的用户才能访问,当然我并没有用[Authentication(Role="admin")]的方法

因为我还没有研究如何继承RoleProvider或者如何实现IPrincipal接口,所以没有使用Role我应该会在之后更新这两个方法的实现方法。

下面是我定义的登陆界面

@model AccessControlSystem.Models.Login
@{
    ViewBag.Title = "View";
}

<h2>Login</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();
    @Html.ValidationSummary(true,"",new { @class="text-danger"})
    <fieldset class="form-horizontal">
        <div class="form-group">
            @Html.LabelFor(model=>model.UserName,htmlAttributes:new {@class="control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(model=>model.UserName,new { htmlAttributes=new { @class="form-control"} })
                @Html.ValidationMessageFor(model=>model.UserName,"",new {@class="text-danger"})
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model=>model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model=>model.Password,new { htmlAttributes=new { @class="form-control"} })
                @Html.ValidationMessageFor(model=>model.UserName,"",new { @class="text-danger"})
            </div>
        </div>

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

    </fieldset>

}

由于是刚刚接触asp.net mvc 有哪里写的不对还请指出

时间: 2024-10-13 11:28:18

asp.net mvc 登陆及用户角色验证的相关文章

asp.net mvc 登陆实现

---恢复内容开始--- asp.net mvc5 登陆及用户身份管理(基础) 近期再写asp.net的网站其中有部分网页需要拥有特权的人才能访问(admin),所以研究如何可以实现用户身份管理. 因为我一开始创建的项目是一个空项目,添加文件夹及核心引用勾选的是mvc所以出现了不能使用Authorize特性登陆: 于是新建了一个项目并且选择了身份验证为个人用户账户.对比发现可能是因为少了startup.auth.cs文件所致. 下面这段代码是我写的登陆代码 1 [HttpGet] 2 publi

ASP.NET MVC下的四种验证编程方式[续篇]

在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注ValidationAttribute特性"."让数据类型实现IValidatableObject或者IDataErrorInfo"),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的故事. 一.ModelValidator与ModelVal

ASP.NET MVC下的四种验证编程方式

原文:ASP.NET MVC下的四种验证编程方式 ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定.总地来说,我们可以采用4种不同的编程模式来进行针对绑定参数的验证. 目录 一.手工验证绑定的参数 二.使用ValidationAttribute特性 三.让数据类型实现IValidatableObject接口 四.让数据类型实现IDataError

ASP.NET MVC 中使用用户控件——转

讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件, 我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <script language="javascript" type="text/javascript" src="<%

ASP.NET MVC下的四种验证编程方式【转】

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑定.总地来说,我们可以采用4种不同的编程模式来进行针对绑定参数的验证. 目录 一.手工验证绑定的参数 二.使用ValidationAttribute特性 三.让数据类型实现IValidatableObject接口 四.让数据类型实现IDataErrorInfo接口 一.手工验证绑定的参数 在 定义具

【记录】ASP.NET MVC 4/5 Authentication 身份验证无效

原文:[记录]ASP.NET MVC 4/5 Authentication 身份验证无效 在 ASP.NET MVC 4/5 应用程序发布的时候,遇到一个问题,在本应用程序中进行身份验证是可以,但不能和其他"二级域名"共享,在其他应用程序身份验证,不能和本应用程序共享,示例代码: System.Web.Security.FormsAuthentication.SetAuthCookie("蟋蟀", true); webconfig 配置如下: <system.

ASP.NET MVC加载用户控件后并获取其内控件值或赋值

有网友看了这篇<ASP.NET MVC加载ASCX之后,并为之赋值>http://www.cnblogs.com/insus/p/3643254.html 之后,问及Insus.NET,不想在控件制器内进行赋值,而是想在视图中使用jQuery来获取用户控件内的控件值或是为它们赋值.那需要怎样来做呢? 下面Insus.NET花上少少时间,做个简单的例子,演示与分享实现的方法. 实现之前,先修改一下AscxUtility.cs这个类中的 public static HtmlString Rende

ASP.NET MVC下判断用户登录和授权的方法

日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization),则对于某种用户角色才开放. 在asp.net mvc中,微软虽然已经帮助开发者构建了ASP.NET Identity这样强大的验证授权框架,但是如果想定制更多的逻辑功能的话,还得自己动动手. 根据日常的开发经验,我总结了下面1种方法: 1 学习了很多人的代码后,发现在Controller里有一个OnActionExecuting方法,此

Asp.Net MVC 使用 DataAnnotations 进行模型验证

通过为模型类增加数据描述的 DataAnnotations ,我们可以容易地为应用程序增加验证的功能.DataAnnotations 允许我们描述希望应用在模型属性上的验证规则,ASP.NET MVC 将会使用这些 DataAnnotations ,然后将适当的验证信息返回给用户. 常用的 DataAnnotations 包括: Required 必须 – 表示这个属性是必须提供内容的字段 DisplayName 显示名 – 定义表单字段的提示名称 StringLength 字符串长度 – 定义