.net webapi跨域无法获取cookie问题解决办法

我会带着你远行 2021-12-07 15:15 566阅读 0赞

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

  1. /// <summary>
  2. /// 同源策略
  3. /// </summary>
  4. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
  5. public sealed class CorsPolicyAttribute : Attribute, ICorsPolicyProvider
  6. {
  7. /// <summary>
  8. /// 同源策略
  9. /// </summary>
  10. private readonly CorsPolicy _Policy;
  11. public CorsPolicyAttribute()
  12. {
  13. _Policy = new CorsPolicy
  14. {
  15. AllowAnyMethod = true,
  16. AllowAnyHeader = true,
  17. AllowAnyOrigin = true,
  18. PreflightMaxAge = 60*60*6
  19. };
  20. _Policy.SupportsCredentials = true; // 这个不能使用True。User跨域问题处理
  21. _Policy.Headers.Add("*");
  22. _Policy.Methods.Add("*");
  23. //_Policy.Origins.Add(PubConstant.CorsUrl);
  24. _Policy.Origins.Add("*");
  25. }
  26. public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  27. {
  28. return Task.FromResult(_Policy);
  29. }
  30. }

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

  1. /// <summary>
  2. /// 基础控制器
  3. /// </summary>
  4. [CorsPolicy]
  5. [AuthFilter]
  6. public class BaseApiController : ApiController

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

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

3.webapi获取cookie方法

  1. public static string GetCookie(HttpRequestMessage request,string cookieName)
  2. {
  3. //var cookies = request.Headers.GetCookies()?.FirstOrDefault();
  4. var cookieList = request.Headers.GetCookies();
  5. var cookies = cookieList?.FirstOrDefault();
  6. string uid = string.Empty;
  7. if (cookies?[cookieName] != null)
  8. {
  9. uid = cookies[cookieName]?.Value;
  10. }
  11. return uid;
  12. }

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

  1. //获取当前用户
  2. Ricky.GetUser = function () {
  3. $.ajax({
  4. type: "get",
  5. url: Ricky.Api.GetUser,
  6. dataType: "json",
  7. async: false,
  8. xhrFields: {
  9. withCredentials: true
  10. },
  11. success: function (result) {
  12. if (result.Code == 0) {
  13. LoginUser = result.Json;
  14. }
  15. else if (result.Code == -3) {
  16. layer.msg(result.Message);
  17. top.location.href = "login.html";
  18. }
  19. else {
  20. layer.msg(result.Message);
  21. }
  22. },
  23. error: function () {
  24. layer.msg("登录信息异常");
  25. }
  26. });
  27. };

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

发表评论

表情:
评论列表 (有 0 条评论,566人围观)

还没有评论,来说两句吧...

相关阅读

    相关 WebAPI设置

    自定义webapi的路由规则,控制到action 跨域设置:(服务端) webconfig文件中,system.webServer节点下添加 <!--跨域请求:三