最近在做的项目得到经验,在做登录的时候,使用FormsAuthenticationTicket,

登录成功以后生成cookia作为登录态维护,票据作为调用其他接口的凭据,票据生成后传到前台作为调用接口的凭证,这里有二种情况

一:不在登录的时候使用cookia,而是根据用户名和webconfig里面的设置使用cookia作为登录的时效维护

(1)登录成功以后
 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(

1,

account,

DateTime.Now,

DateTime.Now.AddHours(12),
true,

JsonConvert.SerializeObject(userData),

FormsAuthentication.FormsCookiePath);

string ticString = FormsAuthentication.Encrypt(ticket);

FormsAuthentication.SetAuthCookie(account, true);    //当没有设置cookies身份验证的时候,按照webconfig的设置表单验证,可设置cookia过期时间的滑动

(2)webconfig里面设置

<system.web>
    <authentication mode="Forms">
      <!--cookia自动滑动十分钟-->
      <forms name=".ASPXAUTH" loginUrl="~/Users/Login" defaultUrl="~/Home/Index" protection="All" timeout="1" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain="" />
    </authentication>

<system.web>

name可以自定义,缺省时ASPXAUTH

二: 官方说:FormsAuthenticationTicket的IsPersistent 属性字段标志 是否为持久化cookie  会话性cookie保存于内存中。关闭浏览器则会话性cookie会过期消失;持久化cookie则不会,直至过期时间已到或确认注销。

但是我试验的结果是,均不能持久化,均会在设置的过期时间到来的时候便凭据失效

(1)登录成功以后,根据用户生成票据,并设置cookia的过期时间,cookia和tict凭据在到期时间都会清空或者失效

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(

1,

account,

DateTime.Now,

DateTime.Now.AddHours(12),
true,

JsonConvert.SerializeObject(userData),

FormsAuthentication.FormsCookiePath);

string ticString = FormsAuthentication.Encrypt(ticket);

var tict = new HttpCookie(FormsAuthentication.FormsCookieName, ticString);
    tict.HttpOnly = true;
    if (ticket.IsPersistent)                    //是否为持久化cookie  会话性cookie保存于内存中。关闭浏览器则会话性cookie会过期消失;持久化cookie则不会,直至过期时间已到或确认注销。
   {
        tict.Expires = ticket.Expiration;            //设置cookie到期时间
    }
                            
  //把票据信息写入Cookie和Session  
//SetAuthCookie方法用于标识用户的Identity状态为true  
  HttpContext.Current.Response.Cookies.Add(tict); //    若不设置cookia的过期时间,默认关闭浏览器(会话)清空cookia,若有设置则按照设置的过期时间

(2)登录成功以后,根据用户生成票据,不设置cookia的过期时间,cookia会在关闭浏览器(会话)清空cookia清空和tict凭据在到期时间或者失效

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(

1,

account,

DateTime.Now,

DateTime.Now.AddHours(12),
true,

JsonConvert.SerializeObject(userData),

FormsAuthentication.FormsCookiePath);

string ticString = FormsAuthentication.Encrypt(ticket);

var tict = new HttpCookie(FormsAuthentication.FormsCookieName, ticString);
   //把票据信息写入Cookie和Session  
//SetAuthCookie方法用于标识用户的Identity状态为true  
  HttpContext.Current.Response.Cookies.Add(tict); //    若不设置cookia的过期时间,默认关闭浏览器(会话)清空cookia,若有设置则按照设置的过期时间

在接口过滤器里面,首先判断登录是否过期,没过期的话则获取前台调用接口时的header,进行解密,获取用户的数据和权限等账号信息,别人系统有三种用户类型,也放到这个过滤器里面判断处理并根据接口的需求修改接口的参数

public override void OnActionExecuting(HttpActionContext actionContext)
        {
            base.OnActionExecuting(actionContext);
            var userCookia = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (userCookia != null)
            {

var auther = actionContext.Request.Headers.Authorization;
                if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
                {
                    return;
                }
                if (auther == null)
                {
                    //actionContext.Response.ReasonPhrase = "登录已过期,请重新登录";
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
                        new {messages = "登录票据已过期,请重新登录获取", resultCode = 1});
                    //HttpContext.Current.Response.Redirect("~/Views/Home/Index.cshtml"); //跳到登陆页面
                }
                else
                {
                    if (auther.Scheme == "Basic" && !string.IsNullOrEmpty(auther.Parameter))
                    {
                        var userData = Functions.JudgeSession(auther.Parameter.Trim());
                        if (userData == null)
                        {
                            //actionContext.Response.ReasonPhrase = "登录已过期,请重新登录";
                            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
                                new { messages = "登录票据已过期,请重新登录获取", resultCode = 1 });
                            // HttpContext.Current.Response.Redirect("~/Views/Home/Index.cshtml"); //跳到登陆页面
                        }
                        else
                        {
                            actionContext.ActionArguments["account"] = userData.GetValue("account").ToString();
                            if (!actionContext.ActionArguments.ContainsKey("accountType")) return;

actionContext.ActionArguments["accountType"] = userData.GetValue("accountType").ToString();

if (
                                !JudgeLoginAccount(userData.GetValue("accountType").ToString(), actionContext,
                                    userData.GetValue("account").ToString()))
                            {
                                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest,
                                    new {messages = "当前登录账号不存在", resultCode = 1});
                            }
                        }
                    }
                    else
                    {
                        //actionContext.Response.ReasonPhrase = "登录已过期,请重新登录";
                        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
                            new { messages = "登录票据已过期,请重新登录获取", resultCode = 1 });
                        // HttpContext.Current.Response.Redirect("~/Views/Home/Index.cshtml"); //跳到登陆页面
                    }
                }
            }
            else
            {
                //actionContext.Response.ReasonPhrase = "登录已过期,请重新登录";
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
                    new { messages = "登录已过期,请重新登录", resultCode = 1 });
                // HttpContext.Current.Response.Redirect("~/Views/Home/Index.cshtml"); //跳到登陆页面
            }
        }

public bool JudgeLoginAccount(string type, HttpActionContext actionContext, string account)
        {

var Type = Convert.ToInt32(type);
            var requestUrlString = actionContext.Request.RequestUri + "当前登录用户不存在用户不存在";
                
            if (Type == 0) //维保总账号
            {

if (_staffService.LoadEntity(o => o.Account == account && o.ParentID == 0).SingleOrDefault() ==
                    null)
                {
                    var str = "登录的维保总账号不存在";
                    YYTLog.Record(requestUrlString, str); //写入日志
                    return false;
                }
            }
            else if (Type == 1) //维保子账号
            {

if (_staffService.LoadEntity(o => o.Account == account && o.ParentID != 0).SingleOrDefault() ==
                   null)
                {
                    var str = "登录的监管人员账号不存在";
                    YYTLog.Record(requestUrlString, str); //写入日志
                    return false;
                }
            }
            else if (Type == 2) //监管人员
            {

if (_supervisorService.LoadEntity(o => o.Account == account).SingleOrDefault() == null)
                {
                    var str = "登录的监管人员账号不存在";
                    YYTLog.Record(requestUrlString, str); //写入日志
                    return false;
                }

}
            else
            {
                var str = "登录的监管人员账号类型有误";
                YYTLog.Record(requestUrlString, str); //写入日志
                return false;
            }
            return true;
        }

webAPI中使用FormsAuthenticationTicket作为登录权限票据的更多相关文章

  1. webapi 中的本地登录

    WebApi 身份验证方式 asp.net WebApi 中有三种身份验证方式 个人用户账户.用户可以在网站注册,也可以使用 google, facebook 等外部服务登录. 工作和学校账户.使用活 ...

  2. springMVC中实现用户登录权限验证

    通过上网搜资料显示,使用filter和interceptor都可以实现.不过推荐使用interceptor. 下面就使用Interceptor实现用户登录权限验证功能. 拦截器需要实现Inceptor ...

  3. OAuth在WebApi中的使用,前后台分离的调用方式

    前段时间由于公司架构服务层向WebApi转换,就研究了OAuth在WebApi中的使用,这中间遇到了很多坑,在此记录一下OAuth的正确使用方式. 1.  OAuth是做什么的? 在网上浏览时,大家都 ...

  4. Asp.Net WebAPI中Filter过滤器的使用以及执行顺序

    转发自:http://www.cnblogs.com/UliiAn/p/5402146.html 在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行 ...

  5. 采用最简单的方式在ASP.NET Core应用中实现认证、登录和注销

    在安全领域,认证和授权是两个重要的主题.认证是安全体系的第一道屏障,是守护整个应用或者服务的第一道大门.当访问者请求进入的时候,认证体系通过验证对方的提供凭证确定其真实身份.认证体系只有在证实了访问者 ...

  6. MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...

  7. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  8. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  9. C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)

    原文地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-into-Jirigala-GPM-DotNet-B ...

随机推荐

  1. mysql管理工具之pt-heartbeat

    之前我一直用Seconds_behind_master来衡量主从的延迟,今天看到文档,才觉得多么不可靠!以下是官方文档的描述: In essence, this field measures the ...

  2. noVNC

    noNVC基础用法: 1.下载noVNC git clone https://github.com/novnc/noVNC.git 2.编辑qemu.conf配置文件 Vim /etc/libvirt ...

  3. 在元素标签中写简单的js函数

    如: <img id="verifyImg" class="passcode" src="__URL__/verify_c" onCl ...

  4. PHP继承中$this的问题

    在父类中的构造函数中使用$this , 这是$this指的是正在实例化的子类对象,不管是parent还是继承调用父类的构造函数. 如: class CompanyController extends ...

  5. Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析

    Office文件的奥秘——.NET平台下不借助Office实现Word.Powerpoint等文件的解析 分类: 技术 2013-07-26 15:38 852人阅读 评论(0) 收藏 举报 Offi ...

  6. 学习c++的优秀博客(转)

    http://zhedahht.blog.163.com/  本博客讨论程序员面试题,并主要集中在C/C++.数据结构算法和算法上.http://saturnman.blog.163.com/ sat ...

  7. Hibernate学习---第十节:Hibernate之QBC、样例查询&离线查询

    一.QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成 1.java 代码如下: /** * 查询所有 */ @Tes ...

  8. Python基础-网络编程request使用

    import requests#get请求 url = "http://127.0.0.1:8000/login" data={"username":" ...

  9. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...

  10. ACM学习历程—HDU 3092 Least common multiple(数论 && 动态规划 && 大数)

    Description Partychen like to do mathematical problems. One day, when he was doing on a least common ...