- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个新项目,我正在就需要如何开发它进行一些辩论。大局是开发一个可使用的 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 ,它就会将其传递给它自己的主机服务器,此时服务器会检查以确保它是
在我确定这些检查有效后,我可以通过从字符串用户名创建 WindowsPrincipal 身份来对用户的操作采取行动,如下所示:
WindowsPrincipal pFoo = new WindowsPrincipal(new WindowsIdentity("username"));
bool test = pFoo.IsInRole("some role");
总而言之,我已经建立了一个来自小部件消费者的可信请求,我不再需要提示进行身份验证。
希望这对你有所帮助。它已经在我的内部环境中运行了大约一个月的质量检查,到目前为止运行良好。
关于php - 事件目录下具有基于信任的身份验证的 JavaScript 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603474/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!