我们有一个第三方数据可视化工具(用 Silverlight 编写),它托管在 IIS 中,根本不提供安全性或身份验证(即,如果您可以访问服务器并且知道 URL,您可以使用它查看它公开的所有数据ODBC 连接中的凭据)。我们已经构建了另一个应用程序,它确实根据登录用户提供了适当的身份验证和访问限制。我们当前“保护”第 3 方应用程序的解决方案是检查用户是否从我们的应用程序访问它。看来我们是通过 Referer 标头来检查 URL 的。
我想知道是否可以向管道添加一个模块,该模块使用我们现有的身份验证和权限来控制对第三方应用程序的访问(我们目前正在使用会话和表单身份验证的混合,但可能会使用声明重写)。听起来它应该可以工作,但是有没有人有尝试过这种事情的经验?陷阱?全方位的坏主意?
更新:我已经与供应商确认它只是一个带有几个页面作为入口点的 ASP.Net 应用程序,因此我应该能够添加表单身份验证。我试图让它使用共享表单cookie,但到目前为止还没有运气。我在我们的网站(localhost/MainApp)和供应商网站(localhost/Vendor)的每个 web.config 中都有这个:
<authentication mode="Forms">
<forms name=".ASPXFORMSAUTH" loginUrl="Login.aspx" protection="All" timeout="20" path="/" />
</authentication>
<machineKey
validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"
validation="SHA1"/>
作为记录,这些不是我将在生产中使用的密钥,而是取自 MSDN 示例。
我已经更新了供应商的 global.asax 文件(我们已经在我们的安装程序中这样做了)以添加:
protected void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
System.Diagnostics.Debug.WriteLine("FormsAuthentication_OnAuthenticate");
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
System.Diagnostics.Debugger.Break();
try
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
args.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(ticket), new string[0]);
if (!args.User.Identity.IsAuthenticated)
{
Context.Response.Redirect("~/Error.htm");
}
}
catch (Exception e)
{
Context.Response.Redirect("~/Error.htm?" + e.Message);
// Decrypt method failed.
}
}
else
{
Context.Response.Redirect("~/Error.htm?CookieNotFound");
}
}
但现在我只是得到“无法验证数据”。从表单标签中删除域后,身份验证现在正在工作。我只需要将它从服务调用中删除,我就准备好了(是的,这确实向全世界开放了服务,或者至少向可以访问 Intranet 的每个人开放)。