Как вы можете использовать один и тот же OracleMembershipProvider в классах C # (файлы .cs) и ASP.NET .aspx? - PullRequest
1 голос
/ 12 октября 2011

Вот проблема, я хочу обрабатывать пользователей, используя встроенные функции членства, в частности, используя 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>

Просмотр некоторых подробностей «провайдера» показывает в основном все нулевые значения / значения по умолчанию, указывая на то, что они не были правильно инициализированы. У меня сложилось впечатление, что конструктор должен инициализировать поставщика членства, используя мой поставщик членства по умолчанию, в соответствии с моим файлом 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 Ответ

0 голосов
/ 23 января 2012

Пожалуйста, ознакомьтесь с первым ответом, данным LordHits на Как мне вызвать Initialize для пользовательского MembershipProvider?

Это, вероятно, ответ на вашу проблему.

...