【问题标题】:Form Authentication and XmlDocument.Load表单身份验证和 XmlDocument.Load
【发布时间】:2010-01-21 05:28:47
【问题描述】:

我正在使用 c# 运行一个 asp.net Web 应用程序。使用以下内容: - Windows 2003 服务器 - IIS6.0 - .net 框架 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 函数起作用了,但是当然,用户可以访问我所有的应用程序页面。

谁知道我做错了什么?

【问题讨论】:

  • 如果您希望我们帮助您解决加载 XML 时遇到的错误,您必须向我们展示您尝试加载的 XML。此外,始终显示 ex.ToString() 而不是 ex.Message。
  • 您可能正在使用 DTD 引用其旧样式的 xml 验证,现在使用 xsd/xmlschema。您需要输入 serchconfig.xml 的内容。

标签: .net xml asp.net-2.0


【解决方案1】:
<?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>

【讨论】:

    【解决方案2】:

    如果您使用表单身份验证,即使您已经登录,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是返回的,不需要通过forms认证再次登录。


    终于找到了解决办法。正如我所解释的,这是由于使用了表单身份验证。我在想,一旦建立了 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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2020-06-21
    • 2011-06-11
    • 2012-03-15
    • 2012-03-05
    • 2012-11-05
    相关资源
    最近更新 更多