GVKun编程网logo

HTTP POST和GET与cookie一起在python中进行身份验证(python中的post和get请求的区别)

13

在本文中,您将会了解到关于HTTPPOST和GET与cookie一起在python中进行身份验证的新资讯,同时我们还将为您解释python中的post和get请求的区别的相关在本文中,我们将带你探索H

在本文中,您将会了解到关于HTTP POST和GET与cookie一起在python中进行身份验证的新资讯,同时我们还将为您解释python中的post和get请求的区别的相关在本文中,我们将带你探索HTTP POST和GET与cookie一起在python中进行身份验证的奥秘,分析python中的post和get请求的区别的特点,并给出一些关于asp.net core 3.x 身份验证-3cookie身份验证原理、ASP.NET Forms身份验证和持久身份验证Cookie安全性、asp.net – SSO表单身份验证问题.无法解密身份验证Cookie、curl – 使用HTTPS进行CouchDB cookie身份验证的实用技巧。

本文目录一览:

HTTP POST和GET与cookie一起在python中进行身份验证(python中的post和get请求的区别)

HTTP POST和GET与cookie一起在python中进行身份验证(python中的post和get请求的区别)

我正在尝试创建一个使用我的ID和密码登录到我的大学站点的python程序。这是登录的正式页面:https
//webapp.pucrs.br/consulta/

您可能会注意到,这两个字段分别命名为pr1和pr2。该页面使用POST发送数据。另外,加载页面时会下载一个cookie,它是一个JSESSIONID,其中包含一个随机值,据我所知,您必须返回POST方法的标头才能验证登录名。

我编写了以下代码,但是GET方法的返回页上显示“会话未初始化”,可能导致cookie没有正确发送回。

from urllib2 import Request, build_opener, HTTPCookieProcessor, HTTPHandlerimport httplib, urllib, cookielib, Cookie, osconn = httplib.HTTPConnection(''webapp.pucrs.br'')#COOKIE FINDERcj = cookielib.CookieJar()opener = build_opener(HTTPCookieProcessor(cj),HTTPHandler())req = Request(''http://webapp.pucrs.br/consulta/principal.jsp'')f = opener.open(req)html = f.read()for cookie in cj:    c = cookie#FIM COOKIE FINDERparams = urllib.urlencode ({''pr1'':111049631, ''pr2'':<pass>})headers = {"Content-type":"text/html",           "Set-Cookie" : "JSESSIONID=70E78D6970373C07A81302C7CF800349"}            # I couldn''t set the value automaticaly here, the cookie object can''t be converted to string, so I change this value on every session to the new cookie''s value. Any solutions?conn.request ("POST", "/consulta/servlet/consulta.aluno.ValidaAluno",params, headers) # Validation pageresp = conn.getresponse()temp = conn.request("GET","/consulta/servlet/consulta.aluno.Publicacoes") # desired content pageresp = conn.getresponse()print resp.read()

我在哪里放置此cookie,以便对登录进行身份验证?

答案1

小编典典

我会尝试使用该requests库。该文档非常出色,并且最终代码比urllib*

$ pip install requests

使用一个自行处理cookie的会话(请参阅Piotr的评论),结果看起来像这样

import requestsurl_0 = "http://webapp.pucrs.br/consulta/principal.jsp"url = "https://webapp.pucrs.br/consulta/servlet/consulta.aluno.ValidaAluno"data = {"pr1": "123456789", "pr2": "1234"}s = requests.session()s.get(url_0)r = s.post(url, data)

似乎工作正常,因为我收到了pr1123456789的“ Usuario inexistente”通知和带有您的用户编号的“
Sehnainválida”。

asp.net core 3.x 身份验证-3cookie身份验证原理

asp.net core 3.x 身份验证-3cookie身份验证原理

https://www.cnblogs.com/jionsoft/archive/2020/02/15/12304479.html


概述

上两篇(asp.net core 3.x 身份验证-1涉及到的概念asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份验证为例来大致说明asp.net core中的身份验证原理。如果我们的应用只考虑浏览器使用,且不考虑前后端分离,cookie是最简单的身份验证方式。虽然这样命名,但我们的用户标识并非一定要存到cookie里,asp.net core允许我们存储到任何地方,如:session、自定义基于内存的存储、redis等等。身份验证与asp.net core Identity结合会更简单,它提供了用户管理功能,以及更身份验证相关的辅助类,如:SignManager,不过暂时不将这东东。

还是以宏观上的理解和使用为主。主要涉及如下流程:

  1. 未登录时请求受保护的资源
  2. 登录
  3. 已登录时访问受保护的资源
  4. 注销

其中步骤1、3差别很小。总体流程大致如下图:

 

先在Startup中做如下配置:

 1         public void ConfigureServices(IServiceCollection services)
 2         {
 3             services.AddAuthentication().AddCookie();
 4             services.AddControllersWithViews();
 5         }
 6 
 7         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 8         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 9         {
10             if (env.IsDevelopment())
11             {
12                 app.UseDeveloperExceptionPage();
13             }
14             else
15             {
16                 app.UseExceptionHandler("/Home/Error");
17             }
18             app.UseStaticFiles();
19 
20             app.UseRouting();
21             app.UseAuthentication();
22             app.UseAuthorization();
23 
24             app.UseEndpoints(endpoints =>
25             {
26                 endpoints.MapControllerRoute(
27                     name: "default",
28                     pattern: "{controller=Home}/{action=Index}/{id?}");
29             });
30         }
View Code

 

流程1、3、访问受保护的资源

当我们在Startup.Configre中 app.UseAuthentication(); 将注册身份验证中间AuthenticationMiddleware,它负责在请求阶段尝试从请求中获取用户标识,若获取到则赋值给HttpContext.User属性,否则以匿名用户身份继续执行下一个中间件。

AuthenticationMiddleware

流程大致如下:

  1. 遍历程序中所有实现IAuthenticationRequestHandler身份验证处理器,调用其HandleRequestAsync方法,此方法若返回true则终止本次请求
  2. 通过AuthenticationSchemeProvider获取默认身份验证方案
  3. 调用httpContext.AuthenticateAsync(默认方案名)尝试从请求中获取当前用户
  4. 如果前一步获取到用户,则设置到httpContext.User属性上
  5. 无论是否成功获取用户请求都会进入下一个中间件继续后续执行

步骤1中允许AuthenticationHandler在特定情况下终止请求,如果我们将来自定义AuthenticationHandler时实现IAuthenticationRequestHandler可以达到这种目的
步骤3是核心,httpContext.AuthenticateAsync是扩展方法,内部从IOC容器中获取AuthenticationService并调用其同名方法

疑惑:AuthenticationMiddleware始终获取默认身份验证方案然后尝试从请求中获取用户标识,这个默认是通过Startup.ConfigreService中 services.AddAuthentication(默认方案名) 来配置的。但一个系统中可以注册多个身份验证方案(如:同时支持Cookie和JWTBearerToken方式),所以咋处理呢?我目前能想到的是要么纯网站直接用cookie,前后端分离或移动端app默认方案设置为JWTBearerToken;另一种方式再自定义一个AuthenticationMiddleware;但是感觉都很别扭,所以你有好的想法请指教下,不胜感激!

 

AuthenticationService.AuthenticateAsync

大致执行如下步骤:

  1. 通过AuthenticationHandlerProvider(注入进来的)获取指定(这里就是默认的)身份验证方案名获取关联的身份验证处理器AuthenticationHandler
  2. 调用AuthenticationHandler.AuthenticateAsync()尝试从请求中获取用户
  3. 返回前尝试将用户标识转换成另一个用户标识(且进行缓存,由于AuthenticationService是Scope注册的,所以没问题)

步骤2针对Cookie身份验证来说最终体现为CookieAuthenticationHandler.HandleAuthenticateAsync()
步骤3在将用户标识设置到httpContext.User之前允许我们添加修改用户标识的某些数据。实现方式是定义类实现IClaimsTransformation并将其(推荐单例)注册到依赖注入容器。

 

CookieAuthenticationHandler.HandleAuthenticateAsync

大致流程如下:

  1. 通过Options.CookieManager获取cookie
  2. 若Options.SessionStore不为空则从其获取票证,否则直接解密cookie得到票证
  3. 处理票证过期(如Option设置了滑动过期,在过期时响应时重新将票证写入cookie)
  4. 回调Events.ValidatePrincipal允许我们修改或替换用户标识

上述步骤多次用到了Options,它是CookieAuthenticationOptions类型的,专门针对基于cookie的身份验证处理器的选项对象,参考:《asp.net core 3.x 身份验证-2启动阶段的配置》,此选项对象的默认赋值行为在PostConfigureCookieAuthenticationOptions.PostConfigre中定义,我们也可以在启动配置时进行定制,
比如我们想直接将票证存储到自定义的存储中时可以参考下面的配置:

  • 自定义一个类实现ITicketStore(参考)
  • 配置cookie身份验证方案时修改选项 services.AddAuthentication().AddCookie(opt=> opt.SessionStore = new MySessionStore()); 

在CookieAuthenticationHandler的其它多个步骤中都可能使用到此选项对象。使用方式都类似。

在前一步骤AuthenticationService.AuthenticateAsync的步骤3中允许我们的代码替换/修改用户标识,在这里的步骤4也允许做类似的事,区别在于前者是针对所有身份验证方案有效的,如默认身份验证方案为JwtBeaerToken时也有效。而后者只是针对cookie身份验证有效。 

 

AuthorizationMiddleware

由于首次请求用户尚未登录,所以context.User为空。授权中间件最终会执行 context.ChallengeAsync(); 最终会执行CookieAuthenticationHandler.HandleChallengeAsync

 

CookieAuthenticationHandler.HandleChallengeAsync

默认大致流程如下:

  1. 组织登录页地址:Options.LoginPath + QueryString.Create(Options.ReturnUrlParameter, 当前地址);
  2. 回调Events.RedirectToLogin,若是ajax请求则返回401状态码,否则跳转到登录页

默认登录页地址"/Account/Login",参考PostConfigureCookieAuthenticationOptions.PostConfigre
默认处理流程如下:

 1 public Func<RedirectContext<CookieAuthenticationOptions>, Task> OnRedirectToLogin { get; set; } = context =>
 2 {
 3       if (IsAjaxRequest(context.Request))
 4       {
 5            context.Response.Headers[HeaderNames.Location] = context.RedirectUri;
 6            context.Response.StatusCode = 401;
 7       }
 8       else
 9       {
10            context.Response.Redirect(context.RedirectUri);
11       }
12       return Task.CompletedTask;
13 };

我们也可以通过在应用启动时通过选项对象来修改。

1 services.AddAuthentication().AddCookie(opt =>
2 {
3      opt.LoginPath = "account/mylogin";
4      opt.Events.OnRedirectToLogin = context =>
5      {
6            context.Response.Redirect(context.RedirectUri);
7            return Task.CompletedTask;
8      };
9 });

 

流程2、登录

前端提交用户名密码,Action去数据库对比,若成功则以用户id(或一些非常常用的和与授权相关的属性)作为用户标识。然后调用HttpContext.SignInAsync(ClaimsPrincipal),所以最终会执行CookieAuthenticationHandler.HandleSignInAsync

 

CookieAuthenticationHandler.HandleSignInAsync

大致步骤如下:

  1. 准备一个CookieSigningInContext(=当前上下文+当前身份验证方案+当前身份验证方案关联的选项对象+需要登录用户的标识+cookie选项+额外数据)
  2. 处理过期时间等属性
  3. 回调Events.SigningIn,允许我们在写入cookie之前做调整
  4. 准备票证(=用户 + 身份验证相关属性 + 身份验证方案名 )
  5. 若此身份验证处理器对应的选项配置了Options.SessionStore则使用此存储,否则加密票证写入cookie
  6. 回调Events.SignedIn
  7. 最后回调Events.RedirectToReturnUrl尝试调整会最初的访问页面

 

流程4、注销

在Action中调用Context.SingOutAsync可以实现注销,在为传入方案名的情况下使用默认身份验证方案进行注销,假设默认是cookie身份验证,则CookieAuthenticationHandler.HandleSignOutAsync将被执行。大致流程如下:
若选项对象配置了Options.SessionStore则从其清空用户标识
回调Events.SigningOut
清除cookie(可能是含sessionKey或包含用户标识的cookie)
通过回调Events.RedirectToReturnUrl跳转到Options.ReturnUrlParameter页面



 

总结

本篇只是从大方向说了下基于cookie的身份验证原理,对于我们开发者来说只要记住如下几个点就行了,将来有特殊需求时再去看源码。

  • 应用启动时Startup中通过AddAuthencation(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(opt=>{ 配置各种选项/不配置直接使用默认值  });Configure方法中app.UseRouting();后app.UseAuthentication();插入身份验证中间件
  • opt是CookieAuthenticationOptions类型,我们可以通过它来参与到身份验证的过程中去,记得它有个回调函数集合Events属性。这个选项对象的默认值定义在PostConfigureCookieAuthenticationOptions.PostConfigre、CookieAuthenticationDefaults,Events属性的类型和默认值参考CookieAuthenticationEvents
  • 通常我们调用身份验证方法是通过HttpContext来调用,它会从IOC容器拿到AuthenticationService调用其同名方法,最终会找到合适的AuthenticationHandler并调用其同名方法

暂时就想到这么多,以后想到再补充吧。

ASP.NET Forms身份验证和持久身份验证Cookie安全性

ASP.NET Forms身份验证和持久身份验证Cookie安全性

当我们在任何ASP.NET框架(ASP.NET MVC,Web窗体等)中使用ASP.NET Forms Authentication时,我们会在客户端的浏览器中保留身份验证cookie.作为最佳实践,我们将cookie设置为HttpOnly并且安全.我们还通过SSL进行所有交易.无论我们使用何种机制来验证用户(OAuth,ASP.NET成员资格提供程序等),我们仍然需要保持身份验证以获得更好的用户体验.

有了所有这些,我假设有人仍然可以从客户端浏览器中获取cookie并使用这些auth cookie值发出请求.服务器无法检测到这种情况,我们会将受保护的数据提供给其他人.

有人认为我想降低这里的风险是每当他/她试图采取一些严肃的行动(例如更改电子邮件地址,访问个人资料信息等)时询问客户的密码,但这并不能解决任何东西,对客户来说都很烦人.

对于这类问题,您有任何积极关注的方法吗?或者在客户端浏览器中保持身份验证的最佳方法是什么?

解决方法

你正在做一切正确的事情.

如果您正在使用成员资格提供程序,那么cookie将仅标记为HTTP(如您所述),因此无法通过客户端脚本(如恶意的XSS)访问该cookie.

如果您已将cookie标记为安全,那么我假设您已将表单身份验证中的“RequireSSL”标志设置为true.通过这样做,cookie不会被发送到任何不通过HTTPS发送到服务器的请求,所以即使你不小心插入HTTP请求(浏览器应该警告用户无论如何嵌入的内容一个HTTPS页面),不会发送cookie.

你可以做的唯一的另一件事 – 这并不能提供你所拥有的很多防御,但这是一个很好的做法 – 也是使用HSTS.我在OWASP Top 10 for .NET developers part 9: Insufficient Transport Layer Protection中讨论这个问题,作为确保通过安全通道继续发送请求的另一种方法.

如果没有对会员提供商进行一些严肃的重新设计,那么你可以做的事情真的不多.您可以将会话绑定到IP,如果它发生更改则不接受请求,但这可能会导致问题(即IP会更改并且不会保护您免受同一地址上的多个人的攻击).您还可以创建浏览器的指纹(即在请求标头中发送的所有内容)并确保后续请求匹配,但我们在此处详细介绍.

但最终,安全性应根据其所保护的资产的价值和恶意活动的可能性进行调整.你没有说你正在保护什么,但如果它是一个金融系统,你会比在博客上使用简单的评论引擎更长.

总而言之,看起来你做得很好,只考虑你在所保护的价值背景下实施的措施的适当性.哦 – 如果您使用sql成员资格提供程序进行凭据存储,请确保您阅读Our password hashing has no clothes然后停止这样做!

asp.net – SSO表单身份验证问题.无法解密身份验证Cookie

asp.net – SSO表单身份验证问题.无法解密身份验证Cookie

我正在尝试在2个Web应用程序,应用程序A和应用程序B之间开发SSO身份验证.应用程序A是MVC 4应用程序,应用程序B是MVC 3应用程序.

应该发生的是:

>当用户尝试访问应用程序B时,他将被重定向到应用程序A的登录页面
>登录到应用程序A后,他将被重定向到应用程序B.

实际发生的是:

>用户尝试访问应用程序B,他被重定向到应用程序A进行登录
>用户登录到应用程序A,他被重定向到应用程序B.
>这里出了问题,因为应用程序B将用户重定向回应用程序A进行登录,就好像他还没有登录一样

我已经完成了这些步骤来找出错误:

>确认身份验证cookie正在传递给应用程序B.
>确认web.config中的两个应用程序的机器密钥验证和解密密钥相同
>在web.config中启用了已确认的enableCrossAppRedirects
>我使用此论坛帖子中的代码来确定两个应用程序是否都能解密身份验证cookie:http://forums.asp.net/t/1762166.aspx/1
>身份验证cookie在应用程序A中成功解密,但在应用程序B中未成功解密.应用程序B在FormsAuthentication.Decrypt方法中提供“无法验证数据”异常

谁能帮我这个?为什么解密失败,即使他们使用相同的机器密钥?我还能依靠这种身份验证方法吗?因为这篇文章说它不再可靠了.
http://blog.appharbor.com/2012/02/22/asp-net-forms-authentication-considered-broken

谢谢!

解决方法

Uf ..终于找到了问题.问题是因为应用程序A的目标是.NET Framework 4.5,而应用程序B的目标是.NET Framework 4.

我以前怀疑过,但显然在项目属性中更改目标框架是不够的.您必须添加此< httpRuntime targetFramework =“4.5”/>应用程序B web.config使其工作.

curl – 使用HTTPS进行CouchDB cookie身份验证

curl – 使用HTTPS进行CouchDB cookie身份验证

我使用HTTPS完全按照文档中给出的指令配置了我的CouchDB(仅我将ssl端口更改为6161).我创建了两个管理员.然后,当我尝试使用cookie身份验证登录时,如下所示:

curl -kX POST https://localhost:6161/_session \
   -H 'Content-Type:application/x-www-form-urlencoded' \
   -d 'name=admin&password=admin'

用户名和密码是正确的,因为我可以使用curl的-u选项登录.但我总是有未经授权的错误.我不确定这里有什么问题.

解决方法

我终于想出了在这种情况下我应该做些什么.我需要结合基本身份验证和cookie身份验证才能登录.

curl -kX POST -u admin:admin https://localhost:6161/_session \
     -H 'Content-Type:application/x-www-form-urlencoded' \
     -d 'name=admin&password=admin'

也许是因为我设置了require_valid_user = true,并且cookie身份验证是REST API之一,而基本身份验证是HTTP协议的一部分,上面的标志会影响HTTP级别.

但现在仍然存在问题:我是否需要每次提供两次登录信息才能进行cookie身份验证?我提供一个基本身份验证登录和另一个cookie身份验证登录?这可能对系统构成威胁吗?

关于HTTP POST和GET与cookie一起在python中进行身份验证python中的post和get请求的区别的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于asp.net core 3.x 身份验证-3cookie身份验证原理、ASP.NET Forms身份验证和持久身份验证Cookie安全性、asp.net – SSO表单身份验证问题.无法解密身份验证Cookie、curl – 使用HTTPS进行CouchDB cookie身份验证的相关信息,请在本站寻找。

本文标签: