C#.Net MVC和CA / Siteminder中间件

时间:2017-03-07 21:13:12

标签: c# jquery siteminder

历史:我有一个很小的应用程序已经存在于Linux网络服务器上一段时间了:html5 / javascript / perl cgi脚本。 CA提供了一种名为Siteminder的第三方中间件,提供SSO服务,工作正常。就我的情况而言,在linux盒子里,DOCROOT中有一个dir,它面向公众,面向html,js& perl cgi脚本。有一个不同的目录,其中授权内容的页面和标记位于其中。 Siteminder配置为知道此auth-dir和包含该auth-dir元素的请求路径。

Siteminder绑定到Apache并观察请求流,当它看到一个带有路径元素的请求时,它会关注它保持入站请求;将访问者重定向到品牌授权页面;处理auth流,然后,如果经过身份验证,则通过发送原始请求。在这种情况下,auth绑定到AD组。再次,这是有效的。我的页面和代码完全没有意识到Siteminder的存在。

出于上述原因,我决定将内容从linux框移动到IIS服务器。将所有内容转换为C#.Net MVC。我不是一个窗户,但这就是我现在的内容。

我们当地的Siteminder专家告诉我,在IIS下,SM的工作原理与linux完全相同。一旦我转换我的代码,它不需要知道SM ......但是有些东西不起作用。

在我的情况下,由于用户交互,一个模式弹出窗口出现在包含小表单的Public部分(HomeController)中。单击提交按钮会触发一个jQuery GET(我也尝试过PUT,POST和重定向)动作到AuthController中的方法,la:

    $.get({
        'url': "/Auth/AddNewData",
        'contentType': "application/x-www-form-urlencoded; charset=UTF-8",
        'dataType': "json",
        'traditional': true,
        'data': {
            'thing': myThing,
            'otherThing': myOtherThing
        }
    }).done(function(data, textStatus, jqXhr) {
        console.log("it worked");
    }).fail(function(jqXhr, textStatus, errorThrown) {
        console.dir(jqXhr);
        console.log(textStatus);
        console.log(errorThrown);
    });

我知道有.Net方式说明目标网址,请耐心等待。

我期望发生的是,如果访问者没有Siteminder设置的auth会话cookie,那么他们应该被重定向到SM身份验证流程,并且一旦授权就完成此请求。

相反,会发生什么:

  • 我使用get方法:它会触发并获得302“对象移动”响应。

  • 如果我使用post方法:它会触发并且我得到200 Ok响应,但返回的有效负载是来自SM的少量html,如果我没有很快重定向到我的目的地按下该html中表单中包含的按钮。 jQuery fail promis会触发,因为它期待JSON结果,而不是html。

  • 如果我使用put没有任何反应。

  • 我注释掉了我的jQuery ajax调用,只是使用了“位置”重定向,然后SM会提出挑战页面;我可以登录;并且,触发请求将“继续”进入长度为3的循环:它调用页面并失败,其中302似乎将请求发送回SM,然后将其发送回目标地址以获得302然后返回到Sm然后回到目标,但它会生成404消息。

我在这里的杂草深处。建议会很精彩

哦,PS:在我的桌面(无SM)上以调试模式运行它。在带有SM的IIS dev服务器上运行Release版本是失败的。

修改

更多信息:在一些额外的siteminder配置之后,我开始收到CORS违规消息。我现在正在设置CORS标头,但这没有任何改变。 Siteminder似乎剥离了CORS标题:/

我注意到的另一件事是,如果我将失败的GET请求设为javascript location.href=url + "?" + queryStringData重定向,那么一切正常。当前的jquery几乎都在将async设置为false,因此制作非异步版本的工作量超出了我想要解决的问题。

我认为本地站点管理员很快会提交一张票。

编辑2

我最终得到了一个hacky“修复”。我不能使用标准的GET,POST,PUT等方法与MVC方法交互,因为Siteminder阻碍了。我已经添加了CORS标头,并尝试过JSONP,在这种情况下都没有。

我必须使用“重定向”。在javascript函数中设置location.href = "/usr?thing=foo&bar=baz",然后由于MVC方法重定向到url。

这可能是Siteminder配置问题。当地的Siteminder专家提交了一张票。

1 个答案:

答案 0 :(得分:0)

您的问题仍然不清楚您列出的每个项目符号的问题。 GET行为符合您的期望吗? 302只是一个重定向,是你期望的重定向吗?

对于" POST",您正在看到" post-preservation"行为。这就是SiteMinder所做的事情,如果你的会话在填写表格时已经超时,你就不会失去工作。后保存是"代理配置对象"中的配置参数。在SiteMinder中。听起来你的SM管理员已经为IIS服务器配置了与Linux服务器不同的ACO。

PUT - 什么都没发生?您根本没有得到任何回复,连接只是挂起?

你的最后一个子弹,带有重定向循环,这个循环通常表示你的用户已登录(已验证)但未经授权,这是SiteMinder策略配置问题(同样听起来不同的策略正在应用于IIS服务器比Linux)

HTH!

-Richard