如何使用 ASP.NET 临时管理员访问身份 [Coming-Soon-Page]
How to use ASP.NET Identity for Temporary Administrator Access [Coming-Soon-Page]
我正在创建一个新网站,它已经上线,但我想阻止所有人访问!并且让我的客户每天用它来检查开发过程,所以他不需要下载所有东西并在他的电脑上设置..
我想知道如何使用 ASP Identity,有没有简单的 "hack" 来实现这个?
或者我唯一的方法如下:
- 将注册页面添加到网站
- 注册一个具有管理员角色的帐户
- 删除网站的注册页面
- 始终使用同一个帐户查看页面
等待答案,如何简单轻松地实现?
编辑:也许有一种方法可以创建默认用户名(在这种情况下是我的管理员?)
谢谢!
非常感谢!
您需要它有多安全?您可以通过 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!
我正在创建一个新网站,它已经上线,但我想阻止所有人访问!并且让我的客户每天用它来检查开发过程,所以他不需要下载所有东西并在他的电脑上设置..
我想知道如何使用 ASP Identity,有没有简单的 "hack" 来实现这个?
或者我唯一的方法如下:
- 将注册页面添加到网站
- 注册一个具有管理员角色的帐户
- 删除网站的注册页面
- 始终使用同一个帐户查看页面
等待答案,如何简单轻松地实现?
编辑:也许有一种方法可以创建默认用户名(在这种情况下是我的管理员?)
谢谢! 非常感谢!
您需要它有多安全?您可以通过 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!