我们目前正在设计一个解决方案,它将作为.Net反向代理后面的WebSeal网络应用程序运行。
我在网上看到了一些评论,人们对此有各种问题,例如重写视图状态。
问题是:有没有人实现了这种技术组合并使其发挥作用?
发布于 2010-12-22 05:15:38
我最初在通过WebSeal访问ASP.Net应用程序时遇到了一些问题。我在一个开发服务器上运行这个站点。对我来说起作用的是在配置文件中关闭调试的情况下部署应用程序。
<compilation debug="false" ...>在打开调试的情况下,有一些AJAX调用在我直接访问站点时可以很好地工作,但在通过WebSeal访问时会失败。一旦我关闭了调试,一切都会正常工作。
另外,因为WebSeal需要匿名身份验证,所以我们不能使用Windows authentication。
发布于 2011-09-07 19:54:53
我在WEBSEAL后面做了一个ASP.NET应用程序。经过大量的研究、开发和测试,系统运行良好。
我建议一些问题来帮助你:
IIS和ASP.NET不区分大小写
("...Login.aspx“和"...login.aspx”都指向同一个页面);默认情况下webseal区分大小写。因此,您应该将WEBSEAL连接设置为大小写不敏感的或检查任何单个链接(页面,javascript,图像)
写入为服务器相对URL的内部链接将不会被提供
WEBSEAL会更改引用您的应用程序的任何链接,但不会更改指向其他应用程序的链接。写为服务器相关URL而不是应用程序相关URL的内部链接将不会被更改(WEBSEAL不会识别它是同一个应用程序),也不会被提供(WEBSEAL拒绝未修改的链接)。
第一条规则是检查任何单个链接,并使其成为应用程序相对URL。
如果你找到<.. href=/ anything>,看看呈现出来的超文本标记语言:这是一个服务器相关的网址,这是不好的。
查看代码,如果你使用"= ~/ anything",它是很好的。如果你使用"= / anything"或ResolveUrl(..),那就不好了。
但这还不够: AJAX将大量的javascript和代码放入ScriptResource.axd和WebResource.axd中,并创建服务器相关的URL来链接它们。这些链接不是由程序员控制的,并且没有简单的方法来更改它们。
简单的解决方案(如果可能):解决将WEBSEAL solve设置为transparent. 的问题
困难的解决方案:编写以下代码(感谢this answer)
protected void Page_Load(object sender, EventArgs e)
{
//Initialises my dirty hack to remove the leading slash from all web reference files.
Response.Filter = new WebResourceResponseFilter(Response.Filter);
}
public class WebResourceResponseFilter : Stream
{
private Stream baseStream;
public WebResourceResponseFilter(Stream responseStream)
{
if (responseStream == null)
throw new ArgumentNullException("ResponseStream");
baseStream = responseStream;
}
public override bool CanRead
{ get { return baseStream.CanRead; } }
public override bool CanSeek
{ get { return baseStream.CanSeek; } }
public override bool CanWrite
{ get { return baseStream.CanWrite; } }
public override void Flush()
{ baseStream.Flush(); }
public override long Length
{ get { return baseStream.Length; } }
public override long Position
{
get { return baseStream.Position; }
set { baseStream.Position = value; }
}
public override int Read(byte[] buffer, int offset, int count)
{ return baseStream.Read(buffer, offset, count); }
public override long Seek(long offset, System.IO.SeekOrigin origin)
{ return baseStream.Seek(offset, origin); }
public override void SetLength(long value)
{ baseStream.SetLength(value); }
public override void Write(byte[] buffer, int offset, int count)
{
//Get text from response stream.
string originalText = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
//Alter the text.
originalText = originalText.Replace(HttpContext.Current.Request.ApplicationPath + "/WebResource.axd",
VirtualPathUtility.MakeRelative(HttpContext.Current.Request.Url.AbsolutePath, "~/WebResource.axd"));
originalText = originalText.Replace(HttpContext.Current.Request.ApplicationPath + "/ScriptResource.axd",
VirtualPathUtility.MakeRelative(HttpContext.Current.Request.Url.AbsolutePath, "~/ScriptResource.axd"));
//Write the altered text to the response stream.
buffer = System.Text.Encoding.UTF8.GetBytes(originalText);
this.baseStream.Write(buffer, 0, buffer.Length);
}这会截获指向页面的流,并将所有出现的"/WebResource.axd“或"ScriptResource.axd”替换为"../../WebResource.axd“和"../../ScriptResource.axd”
开发代码以获取实际的WEBSEAL用户
WEBSEAL已配置为将用户名放入HTTP_IV_USER中。我创建了Webseal\Login.aspx表单来以编程方式读取它。现在,为了让这个用户成为CurrentUser,我放置了一个隐藏的asp.Login
<span style="visibility:hidden">
<asp:Login ID="Login1" runat="server" DestinationPageUrl="~/Default.aspx">..并以编程方式单击了该按钮。
protected void Page_Load(object sender, EventArgs e)
{
string username = Request.ServerVariables["HTTP_IV_USER"];
(Login1.FindControl("Password") as TextBox).Text = MyCustomProvider.PswJump;
if (!string.IsNullOrEmpty(username))
{
(Login1.FindControl("UserName") as TextBox).Text = username;
Button btn = Login1.FindControl("LoginButton") as Button;
((IPostBackEventHandler)btn).RaisePostBackEvent(null);
}
else
{
lblError.Text = "Login error.";
}
}当LoginButton触发时,应用程序读取UserName (从WEBSEAL变量设置)和密码(硬编码)。所以我使用来验证用户并设置当前主体。
web.config中的更改
loginUrl是FormsAuthentication类将重定向到的登录页面的URL。已设置为WEBSEAL门户:未通过身份验证的用户,注销按钮将重定向到门户。
<authentication mode="Forms">
<forms loginUrl="https://my.webseal.portal/" defaultUrl="default.aspx"...."/>
</authentication>由于Webseal/login.aspx不是默认登录页面,因此authorization标记授予未通过身份验证的用户访问权限:
<location path="Webseal/login.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>应用程序设置为使用自定义成员资格提供程序:
<membership defaultProvider="MyCustomMembershipProvider">
<providers>
<add name="MyCustomMembershipProvider" type="MyNamespace.MyCustomMembershipProvider" connectionStringName="LocalSqlServer"/>
</providers>
</membership>
<roleManager enabled="true" defaultProvider="MyCustomRoleProvider">
<providers>
<add name="MyCustomRoleProvider" type="MyNamespace.MyCustomRoleProvider" connectionStringName="LocalSqlServer"/>
</providers>
</roleManager>Debug设置为off:
<compilation debug="false" targetFramework="4.0">这就是所有的人!
https://stackoverflow.com/questions/3758692
复制相似问题