我有点好奇了解OpenID身份验证的工作原理.
OpenID身份验证与站点专门为自己使用的身份验证之间有什么区别吗?
SAML与OAuth联合登录有什么区别?如果公司想要使用第三方Web应用程序,并且还希望单点登录并成为身份验证机构,那么哪种解决方案更有意义?
我正在创建一个多租户网站,为客户端托管页面.URL的第一部分将是一个字符串,用于标识客户端,使用以下URL路由方案在Global.asax中定义:
"{client}/{controller}/{action}/{id}"
Run Code Online (Sandbox Code Playgroud)
这样工作正常,使用/ foo/Home/Index等URL.
但是,当使用[Authorize]属性时,我想重定向到也使用相同映射方案的登录页面.因此,如果客户端是foo,则登录页面将是/ foo/Account/Login,而不是web.config中定义的固定/帐户/登录重定向.
MVC使用HttpUnauthorizedResult返回401未授权状态,我认为这会导致ASP.NET重定向到web.config中定义的页面.
那么有谁知道如何覆盖ASP.NET登录重定向行为?或者通过创建自定义授权属性来重定向MVC会更好吗?
编辑 - 答:在深入研究.Net源代码后,我认为自定义身份验证属性是最佳解决方案:
public class ClientAuthorizeAttribute: AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext filterContext )
{
base.OnAuthorization( filterContext );
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}
Run Code Online (Sandbox Code Playgroud) .net authentication asp.net-mvc forms-authentication asp.net-routing
在应用程序中,转到“文件”>“工作区”>“登录新工作区”会启动一个浏览器窗口。在浏览器中选择工作区后,它会启动一个返回到 slack 的深层链接,但它不起作用。Slack 桌面上没有任何反应。
当检查链接过程中运行的命令时,KDE 似乎正在修改链接。我该怎么做才能解决这个问题?
我正在尝试使用node.js,express和passport.js建立登录机制.登录本身工作得非常好,会话与redis很好地存储,但是在提示进行身份验证之前,我确实遇到了将用户重定向到他开始的地方的麻烦.
例如,用户跟随链接http://localhost:3000/hidden然后被重定向到http://localhost:3000/login但我希望他再次被重定向回http://localhost:3000/hidden.
这样做的目的是,如果用户随机访问他需要首先登录的页面,他将被重定向到提供其凭据的/ login站点,然后被重定向回他之前尝试访问的站点.
这是我的登录帖子
app.post('/login', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) {
return next(err)
} else if (!user) {
console.log('message: ' + info.message);
return res.redirect('/login')
} else {
req.logIn(user, function (err) {
if (err) {
return next(err);
}
return next(); // <-? Is this line right?
});
}
})(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)
在这里我的ensureAuthenticated方法
function ensureAuthenticated (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login'); …Run Code Online (Sandbox Code Playgroud) 我想设置以下内容:
auth.example.com
sub1.example.com
sub2.example.com
Run Code Online (Sandbox Code Playgroud)
如果用户访问sub1.domain.com或sub2.domain.com且他们未登录,则会将其推送到auth.domain.com并登录.sub1.domain.com和sub2.domain.com是两个单独的应用程序但使用相同的凭据.
我尝试在php.ini中设置以下内容:
session.cookie_domain = ".example.com"
Run Code Online (Sandbox Code Playgroud)
但它似乎没有将信息从一个域传递到另一个域.
[编辑]
我尝试了以下方法:
sub1.domain.com/test.php
session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'
Run Code Online (Sandbox Code Playgroud)
auth.domain.com/test.php
session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);
Run Code Online (Sandbox Code Playgroud)
会话ID完全相同但是当我转出$ _SESSION变量时,它不显示两个键,只是我在每个域下设置的任何键.
[编辑2]
我更新了[编辑]
我在我的网站上实现了OpenID,但我很难找到OpenID提供者URL列表.我觉得这很容易找到,但是我已经在网上搜索过,只发现了一小撮,大多是偶然的.
是否有资源列出可用的提供商及其身份验证URL?
编辑:这是我到目前为止找到的.我没有尝试过所有这些,所以如果有任何错误,请告诉我.
StackExchange https://openid.stackexchange.com
Google https://www.google.com/accounts/o8/id - 2014年5月已弃用 - 2015年4月关闭Flickr http://www.flickr.com/username
AOL http://openid.aol.com/username
Blogspot https://www.blogspot.com/
LiveJournal http://username.livejournal.com/
Wordpress https://username.wordpress.com/
VerisignLabs https://pip.verisignlabs.com/ - 2016年9月关闭
MyOpenID https://www.myopenid.com/ - 计划于2014年2月关闭MyVidoop https://myvidoop.com/
Technorati https://technorati.com/people/technorati/username/
更新:我最近从这个问题中了解到,在下面的整个讨论中,我(我确信其他人也这样做)有点令人困惑:我一直称之为彩虹表,实际上称为哈希表.彩虹桌是更复杂的生物,实际上是Hellman Hash Chains的变种.虽然我认为答案仍然是相同的(因为它不归结为密码分析),但有些讨论可能有点偏差.
问题是:" 什么是彩虹表,它们是如何使用的? "
通常,我总是建议使用加密强随机值作为salt,与哈希函数(例如密码)一起使用,例如防止彩虹表攻击.
但实际上盐是随机的加密必需吗?在这方面,任何唯一值(每个用户唯一,例如userId)是否足够?实际上,它会阻止使用单个Rainbow Table来破解系统中的所有(或大多数)密码......
但是缺少熵真的会削弱散列函数的加密强度吗?
注意,我不是在问为什么要使用salt,如何保护它(它不需要),使用单个常量哈希(不要),或者使用什么样的哈希函数.
无论盐是否需要熵.
感谢所有答案到目前为止,但我想集中讨论我(有点)不太熟悉的领域.主要是对密码分析的影响 - 如果有人从密码数学PoV获得一些输入,我会非常感激.
此外,如果还有其他未被考虑的向量,那也是很好的输入(参见@Dave Sherohman指向多个系统).
除此之外,如果您有任何理论,想法或最佳实践 - 请使用证据,攻击情景或经验证据来支持这一点.或者甚至是可接受的权衡的有效考虑因素......我对该主题的最佳实践(资本B资本P)很熟悉,我想证明这实际上提供了什么价值.
编辑:这里有一些非常好的答案,但我认为正如@Dave所说,它归结为Rainbow Tables的常见用户名......以及可能不太常见的名称.但是,如果我的用户名是全局唯一的呢?不一定是我的系统唯一,但每个用户 - 例如电子邮件地址.
没有动力为单个用户构建RT(正如@Dave强调的那样,盐不会保密),这仍然会阻止群集.唯一的问题是我可能在不同的网站上有相同的电子邮件和密码 - 但盐无论如何都不会阻止它.
因此,它回归到密码分析 - 是否需要熵?(我目前的想法是从密码分析的角度来看没有必要,但这是出于其他实际原因.)
security authentication hash cryptography password-protection
如何在本地身份验证后,将本地护照与JWT令牌结合使用?
我想使用node-jwt-simple并查看passport.js我不知道该怎么做.
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
Run Code Online (Sandbox Code Playgroud)
调用done()时是否可以返回令牌?像这样......(只是伪代码)
if(User.validCredentials(username, password)) {
var token = jwt.encode({username: username}, tokenSecret);
done(null, {token : token}); //is this possible? …Run Code Online (Sandbox Code Playgroud) 我正在构建一个移动应用程序,并使用JWT进行身份验证.
看起来最好的方法是将JWT访问令牌与刷新令牌配对,这样我就可以根据需要随时使访问令牌过期.
authentication ×10
jwt ×2
node.js ×2
openid ×2
passport.js ×2
security ×2
.net ×1
asp.net-mvc ×1
cross-domain ×1
cryptography ×1
express ×1
hash ×1
kde-plasma ×1
linux ×1
oauth ×1
oauth-2.0 ×1
php ×1
redirect ×1
saml ×1
session ×1
slack ×1
token ×1