我正在使用c#运行asp.net Web应用程序。使用以下内容: - Windows 2003服务器 - IIS6.0 - .net Framework 2.0.50727
我正在尝试实现表单身份验证,并在Web.Config文件中输入以下代码:
<authentication mode="Forms">
<forms loginUrl="01_Login.aspx"
name=".ASPXFORMSAUTH"
defaultUrl="02_PendingDoc.aspx"
timeout="120"
path="/"
protection="All"
enableCrossAppRedirects="true">
</forms>
</authentication>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
登录正常运行,除非用有效的用户名和密码登录,否则用户无法访问01_Login.aspx以外的任何页面。当用户提供正确的登录详细信息时,将完成以下代码:
FormsAuthentication.RedirectFromLoginPage(logLogin.UserName, false);
但是,当用户点击按钮时,会运行以下代码:
//Load xml file into XMLDocument object
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.Load("SearchConfig.xml");
}
catch (XmlException e)
{
Console.WriteLine(e.Message);
}
上面的xmlDoc.Load函数将失败并创建一个XmlException,并显示以下消息“{”未找到预期的DTD标记。第5行,第3位。“}”。我还试图注释掉Web.Config文件的以下部分:
<deny users="?"/>
然后xmlDoc.Load函数工作,但当然,用户可以访问我的所有应用程序页面。
任何人都知道我做错了什么?
答案 0 :(得分:0)
<?xml version="1.0"?>
<BankSearch><SearchColumns>
<Column>
<Name>Bank_Name</Name>
<Control>TextBox</Control>
<Description>Bank Name</Description>
</Column>
</SearchColumns>
<SearchStoredProc Name="usp_BankSearch">
<Parameter1 control="txtBank_Name">@Bank_Name</Parameter1>
</SearchStoredProc>
<DisplayColumns>
<Column HeaderText="Bank Name" HyperLinkColumn="True" NavigateUrl="~/Bank/Bank.aspx" NavigateUrlFields="Bank_Id" QueryStrings="BID">Bank_Name</Column>
<Column HeaderText="Bank Address">Bank_Address</Column>
<Column HeaderText="Bank Email Id">BANK_EMAIL_ID</Column>
<Column HeaderText="Bank Phone">Bank_Phone</Column>
<Column HeaderText="Bank Fax">BANK_FAX_NO</Column>
<Column HeaderText="City">City</Column>
<Column HeaderText="Postal Code">POSTAL_CODE</Column>
<Column HeaderText="State">STATE_NAME</Column>
<Column HeaderText="Country">Country_Name</Column>
</DisplayColumns>
答案 1 :(得分:0)
如果您正在使用表单身份验证,即使您已经登录,xmlDocument
也会首先进入登录页面。此页面不是XML文件。因此,例外。我看到一个建议可以解决这个问题:
void Main()
{
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = CredentialCache.DefaultCredentials;
var x = new XmlDocument();
x.XmlResolver = resolver;
x.Load("https://yourUrl");
}
这听起来像是一个很好的建议,但我无法使其正常工作。我将尝试使用Web请求来获取xml。因为当我使用Web浏览器时,返回了xml,而无需通过表单身份验证再次登录。
最后找到了解决方案。正如我所解释的,这是由于使用表单身份验证。我在想,一旦建立HTTPS,来自应用程序的所有通信都会自动获得授权。但是,对后端应用程序的调用需要身份验证。这就是为什么我没有得到xml而是得到一个html页面即登录页面的原因。我设法通过添加身份验证cookie来绕过表单身份验证:
var httpCookie = FormsAuthentication.GetAuthCookie(context.User.Identity.Name, false);
var cookie = new Cookie(httpCookie.Name, httpCookie.Value, httpCookie.Path, HttpContext.Current.Request.Url.Host);
var rq = (HttpWebRequest) WebRequest.Create(url);
rq.CookieContainer = new CookieContainer();
rq.CookieContainer.Add(cookie);
var rs = (HttpWebResponse) rq.GetResponse();
var strm = rs.GetResponseStream();
var rdr = new StreamReader(strm);
var str = rdr.ReadToEnd();
var userDetails = new XmlDocument();
userDetails.LoadXml(str);