如何使用ASP.NET标识进行临时管理员访问[即将推出 - 页面]

时间:2016-09-28 14:06:24

标签: c# asp.net authorization asp.net-identity temporary

我正在创建一个新网站,它已经在线,但我想阻止访问所有人!只需让我的客户每天使用它来检查开发过程,所以他不需要下载所有内容并在他的计算机上进行设置..

我想知道如何使用ASP身份,是否有任何简单的“黑客”来实现这一目标?

或者我唯一的方法如下:

  1. 将注册页面添加到网站
  2. 注册具有管理员角色的帐户
  3. 删除网站的注册页面
  4. 始终使用同一帐户查看页面
  5. 等待答案,如何简单轻松地实现这一目标?

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

    谢谢! 非常感谢你!

3 个答案:

答案 0 :(得分:2)

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

在分析了当然不是一个好的选择之后,因为每次我访问我的DbSets时我都会使用上下文构造函数,在没有必要的情况下触发对角色和用户DbSets的额外sql查询(因为我只需要查询如果用户不存在,则启动以插入用户。

所以..因为我的网络托管计划不允许任何更新迁移,种子方法也无法从程序包管理器控制台(because it always reference the 'master' database which I don't have permissions)运行,我找到了这个解决方案:

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

Update-Database -Script -SourceMigration:0

2)然后我需要将Database Initializer设置为null,因此EF不会尝试删除/创建数据库并且我只是在我的 Context类上调用一个方法来自我的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!

答案 1 :(得分:0)

您需要这么安全吗?你可以通过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>      

答案 2 :(得分:0)

所以我使用特定的 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; }
        }
}

然后我需要在 App_Start 上为身份指定创建此类的配置类:

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>

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

祝你好运!