- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一名 Asp.net 开发人员,但对 Asp.net Identity 框架非常陌生。我一直在研究示例应用程序并遵循了一些关于身份的教程,但我仍然无法完全掌握这个概念。我对 Asp.net 成员(member)身份有非常坚定的控制,但 Identity 似乎与成员(member)身份完全不同。我将解释我到目前为止所做的事情。
我正在创建一个简单的应用程序,我在其中遵循代码优先方法。我为 User 创建了实体模型,它继承自 IdentityUser 并有一些额外的字段。下面是用户的实体模型。
public class User : IdentityUser
{
public int? CompanyID { get; set; }
public bool? CanWork { get; set; }
public bool? CanSearch { get; set; }
public Company Company { get; set; }
}
现在在示例中,人们使用名称 ApplicationUser,但出于我自己的目的,我使用了名称 User。在 User 或 ApplicationUser 模型中还有一个方法是,
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
{
CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
我无法理解这种方法的目的。同样从一个示例中,我将以下模型用于角色,
public class Role : IdentityRole
{
public Role()
{
}
public Role(string roleName, string description)
: base(roleName)
{
this.Description = description;
}
public string Description { get; set; }
}
我知道添加了一个额外的字段,但我无法理解重载构造函数的目的。
上述混淆是次要的。我的主要困惑是我很熟悉,当我创建实体模型时,我使用 DbSet 和 DbContext,当我调用任何 Entity Framework 方法来访问数据库时,无论我遵循哪种方案,都会创建/删除创建数据库。
在 Identity 中,哪个方法负责在数据库中创建 Identity 表?我有一个 IdentityConfig 文件,我在其中声明了 ApplicationUserManager 和 ApplicationSignInManager。我还有一个启动文件。以前我在 App_Start 文件夹中只有一个启动文件,当我运行应用程序并尝试访问任何 Identity 方法时,它给了我错误并且没有创建数据库。然后,我将该类设置为部分类,并在根目录中创建了另一个具有相同名称的部分类,然后异常消失并创建了表。那么Startup类负责创建Identity表呢? AspNetUsers 中自动创建了额外的列,例如 PhoneNumber、PhoneNumberConfirmed、TwoFactorEnabled。我不需要这些额外的列。我可以删除这些吗?我可以更改创建的身份表的名称吗?
我知道这些是非常基本的问题,根本不是一个问题,但如果我无法为初学者找到一些基本教程或示例,那将是非常有益的。我所发现的是描述那些我不需要或让我感到困惑的东西。我想了解并控制 Identity 在我的应用程序中应该如何工作,但到目前为止,在我看来,我既没有完全掌握它,也无法根据我的需要进行调整。它就像教程和示例正在教我如何造句,但我无法理解字母。 :(
最佳答案
首先,您必须定义模型 - 正如您正在做的那样 - 实现正确的接口(interface)。
假设您想为您的应用程序创建一个用户:
public class MyUser : IdentityUser<string, MyUserLogin, MyUserRole, MyUserClaim>
{
public string CompanyName { get; set; }
}
如您所见,我已经实现了 IdentityUser
接口(interface)(命名空间 Microsoft.AspNet.Identity.EntityFramework)。
我已经指定了我想为我的主键(字符串)使用什么类型的标识符,并包含了我的自定义对象来管理登录、角色和声明。
现在我们可以定义角色对象了:
public class MyRole : IdentityRole<string, MyUserRole>
{
}
我再次定义了一个类型和类,用于管理属于某个角色的用户。
public class MyUserRole : IdentityUserRole<string>
{
}
MyUserLogin
即将实现IdentityUserLogin<string>
.
MyUserClaim
即将实现IdentityUserClaim<string>
.
如您所见,每个接口(interface)都需要一个主键类型。
第二步,创建用户存储:
public class MyUserStore: UserStore<MyUser, MyRole, string, MyUserLogin, MyUserRole, MyUserClaim>
{
public MyUserStore(MyContext context)
: base(context)
{
}
}
我们再次定义了我们想要使用的用户、角色、登录等。
我们需要UserStore
因为我们的 UserManager 需要一个。
如果您计划管理角色并将角色与每个用户关联,您必须创建您的 RoleStore
定义。
public class MyRoleStore : RoleStore<MyRole, string, MyUserRole>
{
public DaufRoleStore(ApplicationDatabaseContext context) : base(context)
{
}
}
现在您可以创建 UserManager
. UserManager 是真正的 responsible保存对 UserStore
的更改.
public class ApplicationUserManager : UserManager<MyUser, string>
{
public ApplicationUserManager(IUserStore<MyUser, string> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new MyUserStore(context.Get<MyContext>()));
manager.UserValidator = new UserValidator<MyUser, string>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
manager.PasswordValidator = new PasswordValidator()
{
RequiredLength = 5,
RequireNonLetterOrDigit = false, // true
// RequireDigit = true,
RequireLowercase = false,
RequireUppercase = false,
};
return (manager);
}
}
这个类有一个静态方法,它会为你创建一个新的 UserManager。
有趣的是,您可以包含一些您可能需要验证密码等的验证规则。
最后一件事是创建或数据库上下文。
public class MyContext : IdentityDbContext<MyUser, MyRole, string, MyUserLogin, MyUserRole, MyUserClaim>
{
public MyContext(): base("<your connection string here>")
{
}
public static MyContext Create()
{
return new MyContext();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyUser>()
.ToTable("Users");
modelBuilder.Entity<MyRole>()
.ToTable("Roles");
modelBuilder.Entity<MyUserRole>()
.ToTable("UserRoles");
modelBuilder.Entity<MyUserClaim>()
.ToTable("UserClaims");
modelBuilder.Entity<MyUserLogin>()
.ToTable("UserLogins");
}
}
如您所见,我使用模型构建器更改了所有表的名称。您可以在此处定义键或字段类型或表关系。
这是您要在上下文中附加要管理的自定义类的地方:
public DbSet<MyCustomer> Customers{ get; set; }
再次MyContext
有一个 Create
返回新上下文的方法:
public static MyContext Create()
{
return new MyContext();
}
现在你应该有一个启动类,你将在其中引导你的东西:
[assembly: OwinStartup(typeof(ASPNETIdentity2.Startup))]
namespace ASPNETIdentity2
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(MyContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
}
}
}
在这里,您将创建可以在应用程序中使用的数据库上下文和用户管理器。
注意第一行:
[assembly: OwinStartup(typeof(ASPNETIdentity2.Startup))]
这是必需的,因为您要告诉您的环境是需要在...启动时调用的启动类。
现在在您的 Controller 中,您可以简单地引用您的 UserManager
做这样的事情:
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
如何创建表?
在 Visual Studio 中,转到工具 -> NuGet Packager Manager -> 包管理器控制台。
在窗口中有一个“默认项目”组合框。选择您的 ASP.NET MVC 项目。
运行这个命令:
Enable-Migrations
它将创建一个文件Configuration.cs
在名为 Migrations
的新文件夹中.
如果要创建数据库,则需要打开该文件并更改 AutomaticMigrationsEnabled
为真:
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
再次,来自 Package Manager Console
,你可以运行:
Update-Database
您的所有表格都将出现在您的数据库中。不要忘记您的连接字符串。
您可以下载 github project看看一切是如何运作的。
您可以查看这些 two answers与其他一些信息。
first两者中有一些链接到博客,您可以在其中学习所有这些东西。
注意:
如果您想自定义环境的每一部分,您必须完成所有这些操作。
关于asp.net-mvc-5 - 了解 Asp.Net Identity 关键点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631105/
我试图对 ASP.Net MVC 有一个高层次的理解,我开始意识到它看起来很像原始的 ASP 脚本。过去,我们将“模型”/业务逻辑代码组织到 VBScript 类或 VB COM 组件中。 当然,现在
我已经搜索了一段时间,但似乎找不到答案。 我想在我的旋转木马中显示一个计数器,左边是当前项目(工作),左边是项目总数。 我的代码:
. 最佳答案 Scott Gu 称这些为代码块。这就是我的看法。 http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax
我有一个使用 Visual Studio 2010/.net 4/VB 制作的网站。 我真的很喜欢我发现的 FAQ 系统的布局,因为它很简单,但它是经典的 asp。所以,显然,我不能包括我的母版页布局
好吧,对于你们许多人来说,这个问题可能有一个非常明显的答案,但它让我难住了。 我有一个 asp.net Web 表单,上面有两个控件(嗯,不止这两个,但我们将重点关注这些) - 第一个是 asp:dr
当我将 ASP.NET 复选框控件设置为 asp.net 更新面板的异步回发触发器时,EventName 属性是什么? 最佳答案 我相信它是 CheckedChanged。 关于asp.net - a
我有一个用经典 asp 编写的(巨大的)网站。现在我必须切换到 vb.net (razor)。有没有办法将这两个结合起来直到切换完成? 有没有办法让应用程序与经典的 asp 和 vb.net 一起工作
I am creating a products page, where the user selects an option in a radiobuttonlist for example, an
我最近将一个经典的 ASP 应用程序转换为 ASP.NET 3.5,但我觉得我的经典 ASP 版本要快一些(我不知道可能买家会后悔)。 所以你们能帮我解决这个问题吗,让我知道哪个更快,asp、asp.
从本周开始,我被要求开始学习如何使用 ASP 开发网站。我通过 XNA 对 C# 有一定的经验,所以这部分对我来说并不是什么麻烦。 我一直在关注Music Store Tutorial这需要我设置一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我想将一些表单变量发布到经典 ASP 页面中。我不想改变经典的 ASP 页面,因为需要完成大量的工作,以及消耗它们的页面数量。 经典的 ASP 页面需要将表单变量 Username 和 Userpas
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在某种程度上,这可能是一个异端问题。我们有一个大型站点,其中许多页面仍在ASP中。通常,并没有真正动态的,而是包括(通过SSI或Server.Execute)定期重新生成的HTML块。看起来好像是一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有一个遗留的 ASP 应用程序——在不久的某个时候——需要迁移到 ASP.Net 2.0(以与也在 2.0 中的其他应用程序兼容)。 对于这类事情是否有最佳实践,即作为第一步将当前 html、vbs
我目前在一家公司工作,该公司使用 ASP.NET Webforms 和旧 ASP 页面的组合进行 Web 开发。这对于他们当前的项目来说效果很好,但我想说服/建议他们切换到 ASP.NET MVC,因
我有一个经典的 asp 应用程序。我想将该页面的竞赛表格发布到 Asp.Net 表格。原因是我想在进入数据库之前使用我在 Asp.Net 页面中内置的大量逻辑进行验证,而我对 asp 不太了解。更不用
我知道在 ASP.NET MVC 中,您可以拥有移动 View 并执行类似 Index.mobile.cshtml 的操作。和 _Layout.mobile.cshtml并且服务器知道将这些 View
我需要从一些服务器端 c#.net 代码中调用经典 asp 页面上的 VBscript 函数 - 有谁知道一种干净的方法来做到这一点?在 .net 中重写函数不是一种选择。 我会再解释一下这个问题..
我是一名优秀的程序员,十分优秀!