我正在创建一个新网站,它已经在线,但我想阻止访问所有人!只需让我的客户每天使用它来检查开发过程,所以他不需要下载所有内容并在他的计算机上进行设置..
我想知道如何使用ASP身份,是否有任何简单的“黑客”来实现这一目标?
或者我唯一的方法如下:
等待答案,如何简单轻松地实现这一目标?
编辑:也许有一种方法可以创建一个默认用户名(在这种情况下,我的管理员会是这样?)谢谢! 非常感谢你!
答案 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>
我希望它可以帮助那里的人;)
祝你好运!