表单身份验证和XmlDocument.Load

时间:2010-01-21 05:28:47

标签: .net xml asp.net-2.0

我正在使用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_Lo​​gin.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函数工作,但当然,用户可以访问我的所有应用程序页面。

任何人都知道我做错了什么?

2 个答案:

答案 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);