gpt4 book ai didi

php - 事件目录下具有基于信任的身份验证的 JavaScript 小部件

转载 作者:行者123 更新时间:2023-11-30 06:02:11 25 4
gpt4 key购买 nike

我正在构建一个新项目,我正在就需要如何开发它进行一些辩论。大局是开发一个可使用的 JavaScript 小部件,其他内部开发人员可以将其嵌入到他们的 Web 应用程序中。诀窍是消费者需要能够告诉我哪些 AD 用户当前登录到他们的页面......然后我需要相信传递的用户名来自消费者并且没有被外部来源篡改.

整体解决方案需要在消费端有一个非常简单的设置,不涉及编译代码更改。此外,它还需要在 ASP.net 和 PHP 应用程序中正常运行(因此我决定使用 JavaScript)。

总的来说,它有点像 Oauth 解决方案...除了域之间的信任可能是内在的,因为我已经知道公司中的每个用户都信任主机域。

我开始将其删除并有点卡住了。我的想法是,我基本上会托管一个 JavaScript 文件,客户端主机可以将其嵌入到他们的页面中。在他们的页面加载周期中,他们可以初始化我的 JavaScript 小部件并将纯文本用户名传递给它(我真正需要的)。我会以某种方式在客户端主机的网页和我的小部件之间建立安全信任,这样第三方就不可能将我的小部件嵌入到虚假网页中,并在非他们自己的用户下发送操作命令。

我希望这对某些人有意义。

最佳答案

可以这么说,我还没有真正找到答案,但我已经决定了一种方法:

因此,我决定采用一种模式,使用建议的 jQuery UI Widget Factory 编写我的 JavaScript 和 HTML 小部件。 .这允许我的消费者使用简单的语法来实现小部件,例如:

<script src="widget.js"></script>
$('#someElement').myWidget({ encryptionUrl: handlerPath });

现在,您会注意到,作为我的小部件的一部分,我要求消费者传递“handlerPath”。 “处理程序”只是一个 Microsoft MVC Controller ,负责获取登录用户并对调用进行加密。

所以我的应用程序中的处理程序看起来像这样......

[Authorize]
public JsonpResult GetToken(string body, string title, string sender)
{
Packet token = new Packet();
try
{
// Get the widget host's public cert
string publicKey = "some.ssl.key.name.here";
// Get the consumer host's private cert
string privateKey = "this.consumers.ssl.key.name.here";

// Build a simple message object containing secure details
// Specifically, the Body will have action items (in JSON) from my widget
// The User will be generated from the consumer's backend, thus secure
Message message = new Message(){
Body = body,
Title = title,
User = System.Web.HttpContext.Current.User.Identity.Name,
EncryptionServerIP = Request.UserHostAddress,
Sender = new Uri(sender),
EncryptionTime = DateTime.Now
};

PacketEncryption encryption = new PacketEncryption();
// This class just wraps basic encryption and signing methods
token = encryption.EncryptAndSign(message, publicKey, privateKey);
token.Trust = "thisConsumerTrustName";
}
catch (Exception exception)
{
throw;
}

return this.Jsonp(token);
}

现在,我有一个加密的“ token ”,它已使用小部件主机的公钥加密,并使用小部件消费者的私钥签名。这个“ token ”通过 JSONP 从消费服务器传回小部件。

我的小部件然后将这个“ token ”(仍然是 JSONP)发送到它的主机服务器。小部件托管服务器具有如下所示的解密逻辑。

public Message DecryptAndVerify(Packet packet, string requestIP)
{
if (packet == null) throw new ArgumentNullException("packet");
if (requestIP == null) throw new ArgumentNullException("requestIP");

Message message = new Message();

try
{
// Decrypt using the widget host's private key
RSAEncryption decrypto = new RSAEncryption("MyPrivateKey");
// Verify the signature using the "trust's" public key
// This is important because like you'll notice, I get the trust name
// from the encrypted packet. I then maintain a "trust store" mapping
// in my web.config, or SQL server
RSAEncryption verifyo = new RSAEncryption(GetPublicKeyFromTrust(packet.Trust));

string decryptedJson = decrypto.DecryptString(packet.EncryptedData);

// Verify the signature
if (!verifyo.Verify(decryptedJson, packet.Signature))
{
Exception ex = new Exception("Secure packet was not verified. Tamper evident");
throw ex;
}

// If the message is encrypted correctly, turn it into a message object
message = decryptedJson.FromJson<Message>();

// Verify the ip
if (message.EncryptionServerIP != requestIP)
{
Exception ex = new Exception("Request IP does not match encryption IP. Tamper evident");
throw ex;
}

// Verify the time
if ((DateTime.Now - message.EncryptionTime).Seconds > 30)
{
Exception ex = new Exception("Secure packet is too old");
throw ex;
}

}
catch (Exception ex)
{
throw ex;
}
return message;
}

想法是 JavaScript 小部件决定最终用户想要执行的安全操作。然后它回调到它的主机(使用消费者提供的处理程序路径)并请求加密 token 。该 token 包含调用者的 IP 地址、时间戳、当前 AD 用户名以及要完成的一系列操作。一旦小部件收到 token ,它就会将其传递给它自己的主机服务器,此时服务器会检查以确保它是

  • 根据预定义的信任正确签名和加密
  • 不超过 30 秒
  • 从与初始请求相同的 IP 到消费者的服务器

在我确定这些检查有效后,我可以通过从字符串用户名创建 WindowsPrincipal 身份来对用户的操作采取行动,如下所示:

WindowsPrincipal pFoo = new WindowsPrincipal(new WindowsIdentity("username"));
bool test = pFoo.IsInRole("some role");

总而言之,我已经建立了一个来自小部件消费者的可信请求,我不再需要提示进行身份验证。

希望这对你有所帮助。它已经在我的内部环境中运行了大约一个月的质量检查,到目前为止运行良好。

关于php - 事件目录下具有基于信任的身份验证的 JavaScript 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com