- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 PHP 开发 SSO 实现,该实现对用 C# 编写的系统进行身份验证。这里有一些伪代码来演示:
$token = "MqsXexqpYRUNAHR_lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l_tOirhThQYIbfWYErgu4bDwl-7brVhXTWnJNQ2";
$id = "bob@company.com";
$ssokey = "7MpszrQpO95p7H";
$idAndKey = $id . $ssokey;
$salt = base64_decode(substr($token, 0, -1));
$hashed = hash_pbkdf2("sha256", $idAndKey, mb_convert_encoding($salt, 'UTF-16LE'), 1000, 24, false);
$data = base64_encode($hashed);
输出:NWZiMTBhZmNhNTlmYzMxMTEzMThhZmVl
这是我正在集成的系统的 C# 版本:
var token = "MqsXexqpYRUNAHR_lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l_tOirhThQYIbfWYErgu4bDwl-7brVhXTWnJNQ2";
var id = "bob@company.com";
var ssokey = "7MpszrQpO95p7H";
string idAndKey = id + ssokey;
var salt = HttpServerUtility.UrlTokenDecode(token);
var pbkdf2 = new Rfc2898DeriveBytes(idAndKey, salt) {IterationCount = 1000};
var key = HttpServerUtility.UrlTokenEncode(pbkdf2.GetBytes(24));
Console.WriteLine(key.ToString());
输出:aE1k9-djZ66WbUATqdHbWyJzskMI5ABS0
我不知道如何让我的 PHP 代码做同样的事情。我有一种感觉,它在 salt
一代中。
我试过将 C# HttpServerUtility.UrlTokenDecode
函数翻译成 PHP,如下所示:
function UrlTokenDecode($token) {
$numPadChars = substr($token, -1);
// add the padded count to the end
$salt = substr($token, 0, -1) . $numPadChars;
// Transform the "-" to "+", and "*" to "/"
$salt = str_replace('-', '+', str_replace('*', '/', $salt));
// base64_decode
$salt = base64_decode($salt);
return $salt;
}
这并没有让我到达我需要去的地方。住手!
这是用于 Absorb LMS。他们的方法文档在这里:https://support.absorblms.com/hc/en-us/articles/222446647-Incoming-Absorb-Single-Sign-On#Methods
谢谢!
最佳答案
我完全不懂 php,但我认为仍然可以提供帮助。首先,如我的评论所述,C# 中的 Rfc2898DeriveBytes
使用 SHA1 作为哈希函数,而不是 SHA256,这与您的文档所说的无关。
接下来,UrlTokenDecode
(和Encode
)是我在实践中很少见到的很奇怪的东西。它将常规 base64 转换为“url 安全”版本,如下所示:
所以要复制你需要base64_encode
,替换,删除填充,然后添加填充长度作为字符。因此,如果您的 base64 字符串以 ==
结尾 - 您将其删除并在末尾添加“2”。如果没有填充 - 您添加“0”。
因此,要解码该字符串,您需要进行反向替换,然后删除最后一个字符并在该字符指示的末尾添加那么多的“=”。
所以字符串
MqsXexqpYRUNAHR_lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l_tOirhThQYIbfWYErgu4bDwl-7brVhXTWnJNQ2
在正常的 base64 中是 MqsXexqpYRUNAHR/lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l/tOirhThQYIbfWYErgu4bDwl+7brVhXTWnJNQ==
然后,我不知道你为什么要那样做
mb_convert_encoding($salt, 'UTF-16LE')
只需删除它(尽管我不了解 php - 您这样做可能有某些原因,但我无法想象是哪一个,所以要小心)。
然后作为其他答案状态 - hash_pbkdf2() 的最后一个参数应该为真。
进行此更改后,您的代码将起作用(我使用已转换为普通 base64 字符串的 token ):
$token = "MqsXexqpYRUNAHR/lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l/tOirhThQYIbfWYErgu4bDwl+7brVhXTWnJNQ==";
$id = "bob@company.com";
$ssokey = "7MpszrQpO95p7H";
$idAndKey = $id . $ssokey;
$salt = base64_decode($token);
$hashed = hash_pbkdf2("sha1", $idAndKey, $salt, 1000, 24, true);
$data = base64_encode($hashed);
echo $data;
产生预期的答案(在正常的 base64 中——你需要对其进行“url 编码”以获得精确匹配)。
关于C# SSO 哈希迁移到 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49636129/
我在 PingFederate 中配置了 IDP 发起的 SSO,它显示 SSO 应用端点 为:https://myserver/idp/startSSO.ping?PartnerSpId=sp_id
我在 PingFederate 中配置了 IDP 发起的 SSO,它显示 SSO 应用端点 为:https://myserver/idp/startSSO.ping?PartnerSpId=sp_id
我正在尝试使用我的 Office 加载项实现 SSO。为此,我使用 Office IdentityAPI,它要求您拥有一个应用程序 ID URI,该 URI 有一些限制(例如您拥有该域并且正在验证该域
谁能向我解释一下SP发起的SSO和IDP发起的SSO之间的主要区别是什么,包括哪一个是联合实现单点登录的更好解决方案与 ADFS + OpenAM 联盟? 最佳答案 IDP 启动 SSO 来自 Pin
我正在将 Azure Active Directory 配置为 Salesforce 的 SSO 身份验证提供程序。我已经在 Azure 中注册了该应用程序。当我尝试在 Azure 中为注册的应用程序
我正在将 Azure Active Directory 配置为 Salesforce 的 SSO 身份验证提供程序。我已经在 Azure 中注册了该应用程序。当我尝试在 Azure 中为注册的应用程序
我们将 AWS 控制台联合到我们的 Shibboleth IdP (SAML)。 AWS CLIv2 是否支持使用联合账户通过 SSO 访问 CLI?如果是这样——我在哪里可以找到下面链接中列出的“S
我在使用 Jira 插件时遇到多个问题:“Azure Active Directory 单点登录 (SSO) 与 Microsoft 的 JIRA SAML SSO 集成”。 问题: 安装插件时会出现
使用 IdentityServer3、Kentor.AuthServices 0.19(带有 OWIN 中间件)和标准 MVC 4 WebApi 2 应用程序,我们按照 https://github.
有关单点登录(SSO)之前有写过两篇文章 一文读懂 JWT! 看完这篇不能再说不懂SSO原理了! 如果说XXL-JOB你可能并不陌生,它是非常火爆的一个分布式任
我正在为 使用 WSO2 身份服务器SSO 与 saml 在我的演示应用程序中。 我的要求是用户应该向服务提供商登录页面提供登录凭据,而不是身份提供商页面。 出于同样的目的,我关注了 Asela 的以
我对如何使用 SiteMinder 和 OpenSSO 管理以下场景感兴趣 给定两个 Web 应用程序,并强制要求在它们之间使用 SSO。应用程序 A 是一个简单的应用程序,仅需要用户名/密码组合。应
我有一个现有的Wordpress网站。计划是使用cakePHP框架重建站点。由于时间限制,我想一次替换一个Wordpress网站的各个部分。这意味着两个应用程序将并排运行一段时间。我需要使用Wordp
我想在两个网络应用程序之间执行单点登录。这是我的场景: 应用程序 A 和 B(均提供 RESTFUL API)。 应用 B 使用基于表单的身份验证,我无法对应用 B 进行任何修改。此外,应用 A 和应
我是 Cypress 和 JS 的新手。如果未登录,我正在测试的应用程序将重定向到 stub IDP 页面。该应用程序也支持基本身份验证。我在测试中所做的就是cy.visit("https://use
我想为我的自定义 SPA 添加 Azure AD 身份验证。我已在 Azure 门户的应用程序注册中注册了该应用程序。 当我使用 API 调用此“APP”时,我可以获得登录屏幕和 MFA,但登录到 A
我正在尝试设置现有的 ASP.NET Web 应用程序以使用 SAML 或 OAUTH 2.0 对 Azure Active Directory 帐户进行身份验证。教程仅向我展示 MVC 中的示例代码
我正在尝试在基于 spring 的 Web 应用程序中实现一个简单的 SSO 功能。场景: 我有一个主应用程序 Application1 和一个辅助应用程序 2。两者都有自己的登录机制(使用 spri
我已经搜索了这个问题的答案,但是找不到任何答案。 我有一系列要使用同一Facebook应用程序的iOS应用程序。 SSO与我创建和测试的第一个应用程序完美配合。但是其他所有方法都失败,并返回了unkn
我发现 NTLMAuthenticationFilter.java 中有以下代码用于露天共享 SSO 身份验证: Response remoteRes; if (cachedNtlm)
我是一名优秀的程序员,十分优秀!