首页 文章

在ASP.NET中验证Oracle用户

提问于
浏览
1

我在Oracle中有数据库,在ASP.NET中设计了应用程序 . 我想在访问应用程序之前检查用户身份验证 . 用户在Oracle中创建,而不是在应用程序表中创建 .

是否可以使用asp.net对Oracle数据库用户进行身份验证?

该应用程序使用WebForms和Oracle .NET数据提供程序库 .

EDIT

  • 第一页是登录,用户输入Oracle用户名和密码

  • 系统连接到Oracle并对用户进行身份验证 . 请记住用户是在Oracle中创建的而不是在应用程序表中创建

  • 如果有效用户则显示应用程序页面 .

(我可以成功连接到Oracle,但无法对Oracle用户进行身份验证)

2 回答

  • 3

    此示例Web表单应用程序遵循HERE概述的步骤,以便从Oracle数据库对用户进行身份验证 . 该应用程序在受限文件夹中创建 RestrictedPage ,只有经过身份验证的用户才能访问该文件夹 . 尝试访问受限页面的匿名用户将重定向到 Login 页面 . 一旦经过身份验证的用户注销,该应用程序会将其重定向到 Default 主页 .

    enter image description here

    RestrictedPage.aspx:

    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <h1>Restricted Page</h1>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="EMPLOYEE_ID" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="EMPLOYEE_ID" HeaderText="EMPLOYEE_ID" ReadOnly="True" SortExpression="EMPLOYEE_ID" />
            <asp:BoundField DataField="FIRST_NAME" HeaderText="FIRST_NAME" SortExpression="FIRST_NAME" />
            <asp:BoundField DataField="LAST_NAME" HeaderText="LAST_NAME" SortExpression="LAST_NAME" />
            <asp:BoundField DataField="EMAIL" HeaderText="EMAIL" SortExpression="EMAIL" />
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="select employee_id, first_name, last_name, email from hr.employees where employee_id &lt; 150"></asp:SqlDataSource>
    </asp:Content>
    

    Site.Master: 仅显示感兴趣的 div . 其余的是VS项目模板创建的标准样板标记 .

    <div class="navbar-collapse collapse">
        <ul class="nav navbar-nav">
            <li><a runat="server" href="~/">Home</a></li>
            <li><a runat="server" href="~/About">About</a></li>
            <li><a runat="server" href="~/Contact">Contact</a></li>
            <li><a runat="server" href="~/Restricted/RestrictedPage">Restricted</a></li>
        </ul>
        <asp:LoginView runat="server" ViewStateMode="Disabled">
            <AnonymousTemplate>
                <ul class="nav navbar-nav navbar-right">
                    <li><a runat="server" href="~/Account/Register">Register</a></li>
                    <li><a runat="server" href="~/Account/Login">Log in</a></li>
                </ul>
            </AnonymousTemplate>
            <LoggedInTemplate>
                <ul class="nav navbar-nav navbar-right">
                    <li><a runat="server" href="~/Account/Manage" title="Manage your account">Hello, <%: Context.User.Identity.GetUserName()  %> !</a></li>
                    <li>
                        <asp:LoginStatus runat="server" LogoutAction="Redirect" LogoutText="Log off" LogoutPageUrl="~/" OnLoggingOut="Unnamed_LoggingOut" />
                    </li>
                </ul>
            </LoggedInTemplate>
        </asp:LoginView>
    </div>
    

    IdentityModels.cs: 这是为实体模型创建/关联到相应的Oracle模式表而添加的方法 .

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // MUST go first.
    
        modelBuilder.HasDefaultSchema("YOUR_SCHEMA"); // Use uppercase!
    
        modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers");
        modelBuilder.Entity<IdentityRole>().ToTable("AspNetRoles");
        modelBuilder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins");
    }
    

    Web.config: 这是 Restricted 文件夹的Web配置文件 .

    <?xml version="1.0"?>
    <configuration>
      <location path="RestrictedPage.aspx">
        <system.web>
          <authorization>
            <deny users="?"/>
          </authorization>
        </system.web>
      </location>
    </configuration>
    

    Web.config: 这些是对应用程序根文件夹中的全局应用程序配置文件的兴趣的增加 .

    <connectionStrings>
        <add name="DefaultConnection" connectionString="Data Source=your_server_name;User ID=your_user_id;Password=xxxxxxxx;"
          providerName="Oracle.ManagedDataAccess.Client" />
      </connectionStrings>
    
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="Oracle.ManagedDataAccess.Client"
            type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework" />
        </providers>
      </entityFramework>
    

    这是Oracle数据库架构,显示了由引用文章中列出的脚本创建的所需 AspNet.Identity 表 .

    enter image description here

    此应用程序使用Oracle的示例 HR 架构,可从HERE下载 .

    enter image description here

  • 0

    你'll want to use the System.Data.OracleClient namespace for all you'重新数据功能 . 它的行为或多或少类似于System.Data.SqlClient . 看看这些知识库文章中的一篇取决于你是使用C#还是VB:VB:http://support.microsoft.com/default.aspx?scid=kb;en-us;308157 C#:http://support.microsoft.com/default.aspx?scid=kb;en-us;301240你'll have to replace the Sql stuff with Oracle calls, but that shouldn'太难了 .

相关问题