webapi访问不到cookie - CSDN
精华内容
参与话题
  • 1.首先webapi要设置允许跨域 /// <summary> /// 同源策略 /// </summary> [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public sealed class CorsPolicyAtt...

    1.首先webapi要设置允许跨域

    /// <summary>
        ///     同源策略
        /// </summary>
        [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
        public sealed class CorsPolicyAttribute : Attribute, ICorsPolicyProvider
        {
            /// <summary>
            ///     同源策略
            /// </summary>
            private readonly CorsPolicy _Policy;
    
            public CorsPolicyAttribute()
            {
                _Policy = new CorsPolicy
                {
                    AllowAnyMethod = true,
                    AllowAnyHeader = true,
                    AllowAnyOrigin = true,
                    PreflightMaxAge = 60*60*6
                };
                _Policy.SupportsCredentials = true; // 这个不能使用True。User跨域问题处理
                _Policy.Headers.Add("*");
                _Policy.Methods.Add("*");
                //_Policy.Origins.Add(PubConstant.CorsUrl);
                _Policy.Origins.Add("*");
            }
    
    
            public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                return Task.FromResult(_Policy);
            }
        }

    2.API控制器增加同源策略标注

    /// <summary>
        /// 基础控制器
        /// </summary>
        [CorsPolicy]
        [AuthFilter]
        public class BaseApiController : ApiController

    3.存储信息到cookie,注意设置Domain

    public static void SetUserIdCookie(HttpResponseMessage response, string userId)
            {
    
                var expiresDay = 7;
    
                var cookies = new List<CookieHeaderValue>();
                
                //string stryqurc = string.Format(CultureInfo.InvariantCulture, "ricky.{0}",  FunHelper.GetMarkByUserId(userId));
                var newCookie2 = new CookieHeaderValue(UCGlobalDefine.IDCookieName, userId)
                {
                    Domain = "user.17track.net", //这个是api的域名
                    Path = "/",
                    Expires = DateTimeOffset.Now.AddDays(expiresDay)
                };
                cookies.Add(newCookie2);
                response.Headers.AddCookies(cookies);
            }
    
    //response在控制器中创建:
    var response = Request.CreateResponse(HttpStatusCode.OK, result);

    3.webapi获取cookie方法

    public static string GetCookie(HttpRequestMessage request,string cookieName)
            {
                //var cookies = request.Headers.GetCookies()?.FirstOrDefault();
                var cookieList = request.Headers.GetCookies();
                var cookies = cookieList?.FirstOrDefault();
                string uid = string.Empty;
                if (cookies?[cookieName] != null)
                {
                    uid = cookies[cookieName]?.Value;
                }
                return uid;
            }

     

    4.前端ajax访问,注意设置withCredentials

    //获取当前用户
    Ricky.GetUser = function () {
        $.ajax({
            type: "get",
            url: Ricky.Api.GetUser,
            dataType: "json",
            async: false,
            xhrFields: {
                withCredentials: true
            },
            success: function (result) {
                if (result.Code == 0) {
                    LoginUser = result.Json;
                }
                else if (result.Code == -3) {
                    layer.msg(result.Message);
                    top.location.href = "login.html";
                }
                else {
                    layer.msg(result.Message);
                }
            },
            error: function () {
                layer.msg("登录信息异常");
            }
        });
    };

     

    转载于:https://www.cnblogs.com/CuiRicky/p/10808117.html

    展开全文
  • .netcore webapi 一般涉及跨域和Session问题,要使用就得先配置,首先得配置跨域和开启Session。 在Startup中的ConfigureServices里增加: services.AddSession(); services.AddCors(options => { options....

    环境为.netcore 3.1

    .netcore webapi 一般涉及到跨域和Session问题, 要使用就得先配置,首先得配置跨域和开启Session。

    在Startup中的ConfigureServices里增加:

    services.AddSession();
    services.AddCors(options =>
    {
        options.AddPolicy("cors", builder =>
        {
            //AllowAnyOrigin已禁止使用了
            builder.AllowAnyOrigin().WithOrigins("*", "http://localhost:8080") 
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials();//指定处理cookie
        });
    });


       //AllowAnyOrigin已禁止使用了,所以需要直接配置访问域名WithOrigins("*", "http://localhost:8080") 

     

    在Configure里增加:

    app.UseCors("cors");
    
    app.UseSession();

    app.UseCors("cors");这里使用了上面配置的名称“cors”,全局注册。

    这样就配置完成了。

     

    直接从浏览器使用接口地址请求,服务端拿到的SessionId始终是一致的,没什么问题。

     

    但如果从web上跨域请求,比如使用vue前后端分离请求接口,那么就会产生同一浏览器SessionId不一致问题。

     

    解决方案:

    服务端在配置跨域的时候增加

    .AllowCredentials();

    在ajax请求中设置发送cookie信息:

     $.ajax({
       url: a_cross_domain_url,
       xhrFields: {
          withCredentials: true
       }
    });

    如果是vue:

    const instance = axios.create({
        withCredentials: true
    });

    这样,服务端拿到的SessionId就一致了。

    非跨域情况下,这个参数无效的,因为在默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证明等)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据。如果服务器接收带凭据的请求,会用下面的HTTP头部来响应。

    虽然设置了widthCredentials为true的请求中会包含远程域的所有cookie,但这些cookie仍然遵循同源策略,所以外域是访问不了这些cookie的,现在我们就可以安全地跨域访问啦

    展开全文
  • 跨域的概念:这里说的跨域是指通过js在不同的域之间进行数据传输...但是由于种种原因我们又不得进行跨域访问,比如当前后端分离的方式开发程序是跨域是可避免的。而解决跨域的方式也比较简单:1、通过jsonp跨域...

    跨域的概念:

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。
    默认浏览器是不支持直接跨域访问的。但是由于种种原因我们又不得不进行跨域访问,比如当前后端分离的方式开发程序是跨域是不可避免的。
    而解决跨域的方式也比较简单:
    1、通过jsonp跨域
    2、通过修改document.domain来跨子域

    3、添加对服务端进行改造使其支持跨域。

    接下来说说怎么实现asp.net core webapi的跨域(Cors)访问。

    首先你得有个webapi的项目,并添加Microsoft.AspNetCore.Cors的包,然后在Startup中的ConfigureServices下配置新增如下代码:



    1             #region 跨域
    2             var urls = Configuration["AppConfig:Cores"].Split(',');
    3             services.AddCors(options =>
    4             options.AddPolicy("AllowSameDomain",
    5         builder => builder.WithOrigins(urls).AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials())
    6             );
    7             #endregion
    复制代码
    1             #region 跨域
    2             var urls = Configuration["AppConfig:Cores"].Split(',');
    3             services.AddCors(options =>
    4             options.AddPolicy("AllowSameDomain",
    5         builder => builder.WithOrigins(urls).AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials())
    6             );
    7             #endregion
    复制代码

    这样asp.net core webapi就支持了跨域且支持cookie在跨域访问时发送到服务端(不要问我为什么,仔细看看跨域所添加的头就明白了)。

    配置完跨域还需要写明哪些控制器或方法可以跨域,之前看某大神的帖子说须在Startup的Configure中配置如下代码:

     1 app.UseCors("AllowSameDomain");

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Elisoft.PMForWechat.Web.App_Helper.Auth;
    using Microsoft.AspNetCore.Cors;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    
    // For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
    
    namespace Elisoft.PMForWechat.Web.App_Helper
    {
        //启用跨域
        [EnableCors("AllowSameDomain")]
        public class BaseController : Controller
        {
            public AuthManager _authManager { get { return new AuthManager(HttpContext); } }
        }
    }
    复制代码

    然后每个控制器集成上面定义的基础控制器。

    这样整个asp.net core webapi之跨域(Cors)访问 就配置完了。

    最后贴一下在jquery的访问代码:

    复制代码
     1  $.ajax({
     2                 type: 'post',
     3                 url: interfac_url_content.Account_Login,
     4                 data: JSON.stringify(json),
     5                 contentType: 'application/json',
     6                 beforeSend: function () {
     7                     Loading("请稍等,数据提交中... ...");
     8                 },
     9 //必须有这项的配置,不然cookie无法发送至服务端
    10       xhrFields: {
    11               withCredentials: true
    12             },
    13                 success: function (json) {
    14                     $.unblockUI();
    15                     if (handleajaxresult(json)) {
    16                         data=json.data;
    17                         setCookie("Account",data.Account);
    18                         window.location.href = "index.html#/pages/staff/index.html";
    19                     }
    20                 }
    21             });

    1             #region 跨域
    2             var urls = Configuration["AppConfig:Cores"].Split(',');
    3             services.AddCors(options =>
    4             options.AddPolicy("AllowSameDomain",
    5         builder => builder.WithOrigins(urls).AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials())
    6             );
    7             #endregion
    复制代码
    展开全文
  • 今天在测试公司的app的时候发现了这样一个问题,在app调用webapi的时候读取不到session,在网上查了一下果然有类似的问题,果断记录下来。 需求: 1、app在修改密码的时候有一个获取验证码的过程,我们将这个...

    今天在测试公司的app的时候发现了这样一个问题,在app调用webapi的时候读取不到session,在网上查了一下果然有类似的问题,果断记录下来。

    需求:

    1、app在修改密码的时候有一个获取验证码的过程,我们将这个验证码信息记录到了session中。

    2、app在获取完验证码后需要一个验证当前验证码信息及用户信息,问题就出现在验证码校验的过程,此时的session是获取不到信息的。

    分析问题原因:app在请求api的时候缺少sessionid而导致session不知道从哪个session盒子中获取。

    解决方案:

    1、在使用session的时候,给sessionid取个名字,然后发送到客户端,每次都彼此维护这个sessionid。

    2、修改客户端请求的header头。将sessionid设置到cookie中去,确保两次sessionid是一直的。

    第一次获取验证码请求:

    第二次进行校验请求

    转载于:https://www.cnblogs.com/powerMG/p/8028384.html

    展开全文
  • webapi token、参数签名是如何生成的

    万次阅读 2019-08-09 14:43:43
    API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该...
  • 一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权限验证来实现Web系统登录,Mvc前端权限校验以及WebApi服务端的访问校验功能。 1. Web Form认证介绍 ...
  • Cookie 和 LocalStorage 比较

    万次阅读 2017-03-13 16:59:40
    基本概念: Cookie:指某些网站为了辨别用户身份而存储在用户...保存在硬盘中,除非用户手工清理或了过期时间,一般不会删除。 用途 服务器可以设置或读取 Cookies 中包含的信息,借此维护用户跟服务器
  • cookie 跨域问题

    万次阅读 2018-06-12 13:56:38
    cookie 跨域访问 一、 前言 随着项目模块越来越多 ,很多模块现在都是独立部署, 模块之间的交流有事可能会通过cookie完成 , 比如说门户和应用部署在不同的机器或者web容器中 , 假如用户登录之后会在浏览器...
  • Java中Cookie的使用(Cookie 和Session的区别)

    万次阅读 多人点赞 2019-10-24 22:47:18
    文章目录web中什么是会话:保存会话Cookie和Session的区别:Java提供的操作CookieAPI实例代码Cookie注意细节删除Cookiecookie中存取中文 web中什么是会话: 用户开一个浏览器,点击多个超链接,访问服务器多个...
  • 关于web项目给cookie添加Httponly属性 1 过滤器JAVA代码实现 2 配置Tomcat文件
  • WebAPI接口调试技巧

    千次阅读 2020-06-22 13:20:23
    1.了解WebAPI接口 接口模式:基于MVC4.0的WebAPI 承载协议:HTTP 跟踪工具:IE11 请求方式:POST 请求URL:IP:Port/Application/Controller/ActionName/Parameters 请求参数:一串由JSON对象转化而成的字符串 响应...
  • c# WebApi之解决跨域问题:Cors

    千次阅读 2017-11-27 14:57:49
    一、什么是跨域问题出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容。由于这个原因,我们不同站点之间的数据访问会被拒绝。二、CORS解决跨域问题跨域资源共享...
  • 2、把后台代码拉本机 3、通过启动 tomcat或者是apache。 4、打开网页正常调试 这样的好处是整个流程每个人很熟悉,没什么坑。接口调试不通那就找后台吧。 坏处是 1、前端同学需要熟悉基本的后台程序运行
  • 继续这一个系列,WEB后台--基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和session机制)。每个后端不得解决的认证问题。这篇博客会顺带讲解session和cookie机制,希望大家有所收获!!!
  • 一个cookie应用

    万次阅读 2018-04-23 21:57:43
    Cookiesession保持会话状态,cookie进行信息交换。cookie实际上就是在客户和...cookie不需要用户介入,cookie交换是自动完成的(当然,要假设客户端支持cookie)。利用ServletAPI使用Cookie对于cookie,你要做的工作...
  • HTTP协议分析

    万次阅读 多人点赞 2019-06-23 12:30:24
    HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。...
  • CookieAPI详解

    千次阅读 2015-03-20 00:24:48
    CookieAPI详解1、读取cookierequest.getCookies() 返回的是Cookie[] 数组。 首先判断cookies数组是否存在 cookies == null,如果cookies存在,根据cookie的name去查找指定cookie 2、服务器向客户端发送cookiecookie...
  • cookie、sessionStorage和localStorage的区别

    万次阅读 多人点赞 2019-05-30 21:29:47
    一、 概念的理解 webstorage本地存储 1)webstorage是本地存储,存储在客户端,包括localStorage和sessionStorage ...存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,参与和服务器的通信 3)ses...
  • session 、cookie、token的区别

    万次阅读 多人点赞 2016-05-24 10:42:56
    cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入...
  • LiveGBS 实现了 GB28181 协议,能够接入各个厂家的监控设备和监控平台,实现统一管理,和 web 端无插件播放,同时支持手机、微信播放。 LiveGBS 提供简单的登录鉴权,客户端通过用户名密码登录成功后,服务端返回认证...
1 2 3 4 5 ... 20
收藏数 55,795
精华内容 22,318
热门标签
关键字:

webapi访问不到cookie