标签: authentication

Socket.IO身份验证

我试图在Node.js中使用Socket.IO,并试图让服务器为每个Socket.IO客户端提供一个标识.由于套接字代码超出了http服务器代码的范围,因此它无法轻松访问发送的请求信息,因此我假设它需要在连接期间发送.什么是最好的方法

1)通过Socket.IO获取有关谁连接的信息

2)验证他们说自己是谁(我目前正在使用Express,如果这让事情变得更容易)

authentication node.js express socket.io

115
推荐指数
4
解决办法
6万
查看次数

使用无状态(=无会话)身份验证时,CSRF令牌是否必要?

当应用程序依赖无状态身份验证(使用HMAC之类的东西)时,是否有必要使用CSRF保护?

例:

  • 我们有一个单页应用程序(否则我们必须在每个链接上附加令牌:<a href="...?token=xyz">...</a>.

  • 用户使用身份验证自己POST /auth.成功验证后,服务器将返回一些令牌.

  • 令牌将通过JavaScript存储在单页面应用程序内的某个变量中.

  • 此令牌将用于访问受限制的URL,例如/admin.

  • 令牌将始终在HTTP标头内传输.

  • 没有Http Session,也没有Cookies.

据我所知,应该(?!)不可能使用跨站点攻击,因为浏览器不会存储令牌,因此它无法自动将其发送到服务器(这就是使用Cookies时会发生的情况/会议).

我错过了什么吗?

authentication csrf stateless csrf-protection single-page-application

114
推荐指数
2
解决办法
5万
查看次数

Spring Security Filter Chain的工作原理

我意识到Spring安全性构建在过滤器链上,它将拦截请求,检测(缺少)身份验证,重定向到身份验证入口点或将请求传递给授权服务,并最终让请求命中servlet或抛出安全性异常(未经认证或未经授权).DelegatingFitlerProxy将这些过滤器粘合在一起.为了执行他们的任务,这些过滤器访问服务,例如UserDetailsS​​erviceAuthenticationManager.

链中的关键过滤器(按顺序)

  • SecurityContextPersistenceFilter(从JSESSIONID恢复身份验证)
  • UsernamePasswordAuthenticationFilter(执行身份验证)
  • ExceptionTranslationFilter(从FilterSecurityInterceptor捕获安全性异常)
  • FilterSecurityInterceptor(可能会抛出身份验证和授权异常)

我很困惑如何使用这些过滤器.对于弹簧提供的form-login,UsernamePasswordAuthenticationFilter仅用于/ login,而后者的过滤器不是?form-login名称空间元素是否自动配置这些过滤器?是否每个请求(已验证或未验证)都会到达非登录URL的FilterSecurityInterceptor

如果我想使用从登录检索的JWT令牌来保护我的REST API ,该怎么办?我必须配置两个命名空间配置http标签,权限?另一个用于/ login with UsernamePasswordAuthenticationFilter,另一个用于REST url,带有自定义JwtAuthenticationFilter.

配置两个http元素会创建两个springSecurityFitlerChains吗?是UsernamePasswordAuthenticationFilter默认是关闭的,直到我宣布form-login?如何更换SecurityContextPersistenceFilter一个,Authentication从现有JWT-token而不是JSESSIONID

authentication spring filter spring-security jwt

113
推荐指数
3
解决办法
9万
查看次数

Facebook访问令牌服务器端验证iPhone应用程序

我正在开发基于与服务器通信的iPhone应用程序,我想使用Facebook身份验证机制.

基本上,我认为它应该像这样工作:

  1. 在我的iPhone应用程序中,用户使用他的电子邮件和密码登录Facebook.
  2. 用户可以访问相关Facebook应用程序的数据.
  3. 成功登录后,我的iPhone应用程序会收到访问令牌.
  4. 在与我的服务器进一步通信时,我的iPhone应用程序应该使用收到的Facebook访问令牌(例如:在查询中).
  5. 当我的服务器从iPhone应用程序收到一些带有访问令牌的查询时,它应该询问Facebook这个令牌是否有效(以及对谁),如果是,服务器应该假定用户通过Facebook验证.

我的问题是:如果给定的访问令牌有效,服务器应该如何询问Facebook?我想我应该以某种方式检查令牌是否对我的Facebook应用程序有效.

我已经尝试了很多Facebook查询到图形API,我发现,但没有任何工作像我预期的那样.你能举个例子吗?

iphone authentication facebook

112
推荐指数
5
解决办法
5万
查看次数

防伪令牌问题(MVC 5)

我遇到了防伪令牌的问题:(我已经创建了自己的User类,但是现在每次进入/ Account/Register页面时我都会收到错误.错误是:

" http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier "或" http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider " 类型的声明是不在提供的ClaimsIdentity上.要使用基于声明的身份验证启用防伪令牌支持,请验证配置的声明提供程序是否在其生成的ClaimsIdentity实例上提供这两个声明.如果配置的声明提供程序使用不同的声明类型作为唯一标识符,则可以通过设置静态属性AntiForgeryConfig.UniqueClaimTypeIdentifier来配置它.

我找到了这篇文章:

http://stack247.wordpress.com/2013/02/22/antiforgerytoken-a-claim-of-type-nameidentifier-or-identityprovider-was-not-present-on-provided-claimsidentity/

所以我将Application_Start方法更改为:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Email;
}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我收到了这个错误:

提供的ClaimsIdentity中没有" http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress " 类型的声明.

有没有人遇到过这个?如果是这样,你知道如何解决它吗?

提前干杯,
r3plica

更新1

这是我的自定义用户类:

public class Profile : User, IProfile
{
    public Profile()
        : base()
    {
        this.LastLoginDate = DateTime.UtcNow;
        this.DateCreated = DateTime.UtcNow;
    }

    public Profile(string userName)
        : base(userName)
    {
        this.CreatedBy = this.Id;

        this.LastLoginDate = DateTime.UtcNow;
        this.DateCreated = DateTime.UtcNow;

        this.IsApproved = true;
    }

    [NotMapped]
    public HttpPostedFileBase File { …
Run Code Online (Sandbox Code Playgroud)

c# authentication asp.net-mvc claims-based-identity

112
推荐指数
6
解决办法
6万
查看次数

流行的应用程序如何验证从移动应用程序到其服务器的用户请求?

假设我有一个连接到.Net API的Android应用程序,用于接收/设置数据.我所遇到的困惑是关于如何在每次向API发出请求时第一次注册/登录用户并对其进行身份验证.

  • 如果我只使用基于用户名/密码的身份验证,他们将不够安全?
  • 当然,出于安全原因,我无法在设备中保存该用户名/密码?
  • 我是否应该在注册时为每个用户发出GUID,将其保存在他们的设备中并在API请求期间每次检索?

还有哪些其他模式可用,哪些模式最有效和最安全,我只需要一个流程.有人能告诉我Facebook,FourSquare或Twitter等着名的Android应用程序使用什么方法来验证从他们的移动应用程序到他们的服务器的每个请求?

如果这不是一些公开信息,请提前抱歉.

authentication android facebook foursquare

109
推荐指数
4
解决办法
7万
查看次数

MVC 5访问声明身份用户数据

我正在使用Entity Framework 5 Database First方法开发MVC 5 Web应用程序.我正在使用OWIN进行用户身份验证.下面显示我的帐户控制器中的登录方法.

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
        if (user != null)
        {
            var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

            identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
            identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
            identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?

            AuthenticationManager.SignIn(new AuthenticationProperties
            {
                IsPersistent = model.RememberMe
            }, identity);

            return RedirectToAction("Index", "MyDashboard");
        }
        else
        {
            ModelState.AddModelError("", "Invalid username or password."); …
Run Code Online (Sandbox Code Playgroud)

asp.net authentication asp.net-mvc claims-based-identity asp.net-mvc-5

109
推荐指数
9
解决办法
18万
查看次数

服务器端处理JWT令牌的最佳实践

(从这个线程产生,因为这实际上是一个问题,而不是NodeJS等)

我正在实现一个带有身份验证的REST API服务器,并且我已经成功实现了JWT令牌处理,以便用户可以使用用户名/密码通过/ login端口登录,在该端点上从服务器机密生成JWT令牌并返回到客户.然后,令牌在每个经过身份验证的API请求中从客户端传递到服务器,然后使用服务器机密来验证令牌.

但是,我正在努力了解有关如何以及在何种程度上验证令牌的最佳实践,以构建真正安全的系统.究竟什么应该参与"验证"令牌?是否可以使用server-secret验证签名,还是我还应该针对存储在服务器中的某些数据交叉检查令牌和/或令牌有效负载?

基于令牌的身份验证系统只会像在每个请求中传递用户名/密码一样安全,前提是获取令牌与获取用户密码相同或更困难.但是,在我看过的例子中,生成令牌所需的唯一信息是用户名和服务器端秘密.这不意味着假设一分钟恶意用户获得服务器机密的知识,他现在可以代表任何用户生成令牌,从而不仅可以访问一个给定用户,如果密码是获得了,但事实上对所有用户帐户?

这让我想到了一些问题:

1)JWT令牌验证是否应限于验证令牌本身的签名,单独依赖服务器机密的完整性,还是附带单独的验证机制?

  • 在某些情况下,我已经看到了令牌和服务器会话的组合使用,在成功登录/ login端点后会建立会话.API请求验证令牌,并将令牌中找到的解码数据与会话中存储的某些数据进行比较.但是,使用会话意味着使用cookie,并且在某种意义上它违背了使用基于令牌的方法的目的.它也可能导致某些客户出现问题.

  • 可以想象服务器将当前正在使用的所有令牌保存在内存缓存或类似内容中,以确保即使服务器机密被泄露,以便攻击者可以生成"有效"令牌,只有通过/ login端点生成的确切令牌会被接受.这是合理的还是只是多余/过度杀伤?

2)如果JWT签名验证是验证令牌的唯一方法,意味着服务器机密的完整性是一个突破点,那么应该如何管理服务器机密?从环境变量读取并在每个部署的堆栈中创建(随机化?)一次?定期重新创建或轮换(如果是这样,如何处理在轮换之前创建但需要在轮换之后进行验证的现有有效令牌,如果服务器在任何给定时间保持当前和之前的秘密,则可能就足够了) ?别的什么?

当谈到服务器机密被泄露的风险时,我可能只是过于偏执,这当然是一个需要在所有加密情况下解决的更普遍的问题......

security authentication token secret-key jwt

109
推荐指数
4
解决办法
4万
查看次数

passport.session()中间件有什么作用?

我正在使用Passport.js使用Easy Node Authentication:Setup and Local教程构建一个身份验证系统.

我很困惑passport.session().

在使用不同的中间件后,我开始明白这express.session()是通过cookie向客户端发送会话ID的内容,但我很困惑passport.session()除了之外需要什么以及为什么需要它express.session().

以下是我设置应用程序的方法:

// Server.js配置应用程序并设置Web服务器

//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');

var configDB = require('./config/database.js');

//Configuration of Databse and App

mongoose.connect(configDB.url); //connect to our database

require('./config/passport')(passport); //pass passport for configuration

app.configure(function() {

    //set up our express application

    app.use(express.logger('dev')); //log every request to …
Run Code Online (Sandbox Code Playgroud)

authentication session node.js express passport.js

108
推荐指数
4
解决办法
7万
查看次数

单个登录跨多个域

我们公司设有多个域,每个域上都有一个网站.此时,每个域都有自己的身份验证,通过cookie完成.

当登录到一个域的某个人需要访问另一个域的任何内容时,用户需要使用位于另一个域的另一个网站上的不同凭据再次登录.

我正在考虑转向单点登录(SSO),这样就可以消除这种麻烦.我很感激有关如何实现这一点的任何想法,因为我在这方面没有任何经验.

谢谢.

编辑: 网站是互联网(外部)和内部网(公司内部使用)网站的混合.

authentication single-sign-on

106
推荐指数
4
解决办法
8万
查看次数