如何使用 ASP.NET 临时管理员访问身份 [Coming-Soon-Page]

How to use ASP.NET Identity for Temporary Administrator Access [Coming-Soon-Page]

我正在创建一个新网站,它已经上线,但我想阻止所有人访问!并且让我的客户每天用它来检查开发过程,所以他不需要下载所有东西并在他的电脑上设置..

我想知道如何使用 ASP Identity,有没有简单的 "hack" 来实现这个?

或者我唯一的方法如下:

  1. 将注册页面添加到网站
  2. 注册一个具有管理员角色的帐户
  3. 删除网站的注册页面
  4. 始终使用同一个帐户查看页面

等待答案,如何简单轻松地实现?

编辑:也许有一种方法可以创建默认用户名(在这种情况下是我的管理员?)

谢谢! 非常感谢!

您需要它有多安全?您可以通过 IP 限制以另一种方式进行处理。

选项 1 - 仅允许特定 IP 访问您的网站

我建议在您的 web.config 中阻止对网站的所有访问,并且只将您和客户端将要连接的 IP 列入白名单 - 这会节省您的时间,而且会确保您只从您信任的 IP 获得连接。

修改合适的web.config

<configuration>
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">                    
        <clear/> 
        <add ipAddress="127.0.0.1" allowed="true"/> 
        <add ipAddress="x.x.x.x" allowed="true"/>   <!-- your internal or external ip -->
        <add ipAddress="x.x.x.x" allowed="true"/>   <!-- your client's ip -->
        <add ipAddress="a.b.c.0" subnetMask="255.255.255.0" allowed="true"/>  <!-- your IP range (or client's IP range), if connecting from multpipe IPs on same subnet -->
      </ipSecurity>
    </security>
  </configuration>
</system.webServer>

根据需要添加尽可能多的 <add> 指令

选项 2 - 将基本身份验证添加到 web.config

这不是永久性的解决方案。长期研究其他身份验证方法。

<system.web>      
  <authentication mode="Forms">      
    <credentials passwordFormat="Clear">      
      <user name="jdoe1" password="someinsecurepassword" />      
    </credentials>      
  </authentication>      
  <authorization>      
    <allow users="jdoe1" />      
    <deny users="*" />      
  </authorization>      
</system.web>      

所以我通过一个特定的 DbContext 来解决这个问题,如果他不存在于数据库中,它会创建我的默认用户。

后续代码如下:

namespace MyNamespace
{
    public class MyContext: IdentityDbContext<IdentityUser>
        {

            public MyContext() : base("DefaultConnection")
            {
                if (!Roles.Any(r => r.Name == "admin"))
                {
                    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(this));
                    RoleManager.Create(new IdentityRole("admin"));
                }                


                if (!Users.Any(u => u.UserName == "mydefaultuser"))
                {
                    var store = new UserStore<IdentityUser>(this);
                    var manager = new UserManager<IdentityUser>(store);

                    var user = new IdentityUser { UserName = "mydefaultuser" };

                    manager.Create(user, "password");
                    manager.AddToRole(user.Id, "admin");
                }
            }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }

            public DbSet<MyItem1> myStuff1 { get; set; }
            public DbSet<MyItem2> myStuff2 { get; set; }
            public DbSet<MyItem3> myStuff3 { get; set; }
            public DbSet<MyItem4> myStuff4 { get; set; }
            public DbSet<MyItem5> myStuff5 { get; set; }
        }
}

然后我需要为 Identity 指定配置 class 在 App_Start[= 上创建此 class 29=]:

namespace MyNamespace
{
    public class IdentityConfig
        {
            public void Configuration(IAppBuilder app)
            {
                app.CreatePerOwinContext(() => new WeirdMachineContext());
                app.UseCookieAuthentication(new CookieAuthenticationOptions
                {
                    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                    LoginPath = new PathString("/Home/Login"),
                });
                FormsAuthentication.SetAuthCookie("CookieValue", false);
            }
        }
}

最后我不得不在 Web.config 中添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections></configSections>
  <appSettings>
    <!-- A lot of other stuff here.. -->
    <add key="owin:AppStartup" value="MyNamespace.IdentityConfig" />
  </appSettings>
    <!-- More stuff here.. -->
</configuration>

我希望它能帮助那里的人 ;)

祝你好运!

正如用户@trailmax 所建议的那样,我没有选择为身份插入默认用户的最佳位置,因为每次调用上下文的构造函数时我都会插入用户。

经过分析当然这不是一个好的选择,因为每次我访问我的 DbSet 时我都使用上下文构造函数,触发对角色和用户 DbSet 的额外 sql 查询,而不需要(因为我只需要那个在启动时查询以插入用户(如果用户不存在)。

所以..因为我的网络托管计划不允许任何更新迁移,也不允许从包管理器控制台运行种子方法 (),我找到了这个解决方案:

1) 我在我的远程 mssql 数据库上创建了我所有的表 运行 一个 sql 脚本(以从我的上下文和模型中获取生成的 SQL 脚本,我在 程序包管理器控制台 中键入 following command

Update-Database -Script -SourceMigration:0

2) 然后我需要将 Database Initializer 设置为 null,因此 EF 不会尝试 drop/create a Database 最后我只是在我的数据库上调用一个方法上下文 Class 来自我的 Global.asax 方法 Application_Start:

protected void Application_Start()
{
     AreaRegistration.RegisterAllAreas();
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
     RouteConfig.RegisterRoutes(RouteTable.Routes);
     BundleConfig.RegisterBundles(BundleTable.Bundles);
     Database.SetInitializer<MyContext>(null);
     new MyContext().CreateDefaultUsers();
}

3) 这是我的方法,仅在应用程序启动时调用(我几乎可以肯定,至少我希望如此,我想节省 CPU 时钟!)

public class MyContext : IdentityDbContext<IdentityUser>
{
        public MyContext() : base("MyContext")
        {
        }


        internal void CreateDefaultUsers()
        {
            if (!Roles.Any(r => r.Name == "admin"))
            {
                var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(this));
                RoleManager.Create(new IdentityRole("admin"));
            }


            if (!Users.Any(u => u.UserName == "myadmin"))
            {
                var store = new UserStore<IdentityUser>(this);
                var manager = new UserManager<IdentityUser>(store);

                var user = new IdentityUser { UserName = "myadmin" };

                manager.Create(user, "mysupersafepwlulz");
                manager.AddToRole(user.Id, "admin");
            }
        }
     //More stuff not relevang for the question...

}

我希望这对那里的人有所帮助,谢谢@trailmax!