如何在 C# 类(.cs 文件)和 ASP.NET .aspx 文件中使用相同的 OracleMembershipProvider?

Posted

技术标签:

【中文标题】如何在 C# 类(.cs 文件)和 ASP.NET .aspx 文件中使用相同的 OracleMembershipProvider?【英文标题】:How can you use the same OracleMembershipProvider in C# classes (.cs files) AND ASP.NET .aspx files? 【发布时间】:2011-10-11 22:14:18 【问题描述】:

问题来了,我想使用内置的会员功能来处理用户,特别是使用 Oracle.Web.Security.OracleMembershipProvider。我已经让提供程序在 .aspx 文件中工作,正确地将新用户插入到适当的 Oracle 表中并处理登录。但是,我在解决方案的网站组件旁边有一个网络服务。我只希望通过网站注册并且可以通过网络请求发送有效用户名/密码的用户能够访问数据。

无论如何,在 .cs 文件中我这样做:

OracleMembershipProvider provider = new OracleMembershipProvider(); 
if (!provider.ValidateUser(username, password)) 

    return null;

对 ValidateUser 的调用引发异常,详细信息:“OracleConnection.ConnectionString 无效”。

我认为连接字符串在 .aspx 页面上有效这一事实足以确认连接字符串是有效的。

这是 .aspx 文件中的样子,关键在第二行 MembershipProvider="MyOracleMembershipProvider"

<asp:Login ID="LoginUser" runat="server" EnableViewState="false" 
    RenderOuterTable="false" MembershipProvider="MyOracleMembershipProvider">
    <LayoutTemplate>
        <span class="failureNotification">
            <asp:Literal ID="FailureText" runat="server"></asp:Literal>
        </span>
        <asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="failureNotification" 
             ValidationGroup="LoginUserValidationGroup"/>
        <div class="accountInfo">
            <fieldset class="login">
                <legend>Account Information</legend>
                <p>
                    <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Username:</asp:Label>
                    <asp:TextBox ID="UserName" runat="server" CssClass="textEntry"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName" 
                         CssClass="failureNotification" ErrorMessage="User Name is required." ToolTip="User Name is required." 
                         ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
                </p>
                //blah blah blah, code removed for length.
            </fieldset>
            <p class="submitButton">
                <asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Log In" ValidationGroup="LoginUserValidationGroup"/>
            </p>
        </div>
    </LayoutTemplate>
</asp:Login>

查看 'provider' 的一些详细信息基本上会显示所有空值/默认值,表明它没有正确初始化。我的印象是构造函数应该使用我的默认成员提供程序初始化成员提供程序,根据我的 web.config 文件,如下所示:

<configuration>
  <system.data>
    <DbProviderFactories>      
      <clear />
      <add name="xxxOracleDataProvider" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" 
       type="Oracle.DataAccess.Client.OracleClientFactory, 
             Oracle.DataAccess, 
             Version=4.112.2.0, 
             Culture=neutral, 
             PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>  

<connectionStrings>
  <add name="MEMBERSHIP_PROVIDER" 
     connectionString="
      Persist Security Info=True;
      user id = xxxxxx; 
      password = xxxxxx; 
      data source=
      (DESCRIPTION = 
        (ADDRESS_LIST = 
          (ADDRESS = 
            (PROTOCOL = TCP)
            (HOST = xxxxxxx)
            (PORT = xxxxxxxx)
          )
        )
        (CONNECT_DATA = 
         (SERVICE_NAME = xxxxx)
         (SERVER = DEDICATED)
        )
      );"
     providerName="Oracle.DataAccess"
     />       
</connectionStrings>

<system.web>
<customErrors mode="Off"/>
<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>
<compilation debug="true"/>    
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login.aspx" timeout="2880"/>
</authentication>
<membership defaultProvider="MyOracleMembershipProvider" hashAlgorithmType="SHA1">
  <providers>
    <clear />        
    <add name="MyOracleMembershipProvider"
         type="Oracle.Web.Security.OracleMembershipProvider, 
         Oracle.Web, Version=4.112.1.2, Culture=neutral,
         PublicKeyToken=89b483f429c47342"
         connectionStringName="MEMBERSHIP_PROVIDER"
         applicationName="xxx_xxxx_xxxxxx"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="false"
         requiresUniqueEmail="true"
         passwordFormat="Hashed"
         minRequiredNonalphanumericCharacters="0"
         maxInvalidPasswordAttempts="7"
         minRequiredPasswordLength="12"
         passwordAttemptWindow="8"             
         />
  </providers>
</membership>    
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>

我试过了:

 Membership.Provider.ValidateUser(username, password)

也是。它总是返回 false 并且 Providers 属性与我的默认提供程序的属性不匹配(当我设置断点并观察对象时)。

有人知道如何解决这个问题吗?我觉得这应该很简单,因为数据提供程序在 .aspx 页面上运行良好,但我无法获得 .cs 文件来使用相同的提供程序,甚至无法看到提供程序存在。

【问题讨论】:

【参考方案1】:

请看LordHits在How do I call Initialize on a custom MembershipProvider?上给出的第一个答案

这可能是您问题的答案。

【讨论】:

以上是关于如何在 C# 类(.cs 文件)和 ASP.NET .aspx 文件中使用相同的 OracleMembershipProvider?的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 ASP.NET 上的 BLL 类

C# Asp.Net 中的类和对象

ASP.NET MVC C# 如何分隔导航栏链接?

用vs2010平台,c#写的asp.net网站,动态增加和减少Textbox

如何从asp.net中的js函数调用c#函数?

ASP.NET c# 实验日记