MVC6/EF7:播种主用户和声明
MVC6/EF7: Seeding Master User and Claims
我正在为数据端使用 EF7 编写一个简单的 MVC6 应用程序,运行 在设置用户和声明方面遇到了一些问题。具体来说,我有一个数据库播种例程,用具有特定声明的特定用户(我)填充数据库中的身份表。此播种方法是从 startup.cs.
中调用的
很简单:
public static async Task CreateMasterUser( UserManager<ApplicationUser> userMgr, ILogger logger )
{
var user = await userMgr.FindByEmailAsync("my email");
if( user == null )
{
user = new ApplicationUser()
{
Email = "my email",
FirstName = "blah",
LastName = "blah",
UserName = "Blah",
};
IdentityResult result = await userMgr.CreateAsync(user, "mypw");
if( !result.Succeeded )
{
logger.LogCritical("Failed to create master user. Messages were: " + String.Join("; ", result.Errors.Select(x => x.Description)));
return;
}
}
await AddClaim(user, userMgr, "user.add", "allowed");
await AddClaim(user, userMgr, "user.delete", "allowed");
await AddClaim(user, userMgr, "user.edit.self", "allowed");
await AddClaim(user, userMgr, "user.edit.all", "allowed");
await AddClaim(user, userMgr, "user.confirm", "allowed");
await AddClaim(user, userMgr, "content.add", "allowed");
await AddClaim(user, userMgr, "content.view", "allowed");
await AddClaim(user, userMgr, "content.edit", "allowed");
await AddClaim(user, userMgr, "content.delete", "allowed");
}
private static async Task AddClaim( ApplicationUser user, UserManager<ApplicationUser> userMgr, string claim, string value )
{
if( user.Claims.SingleOrDefault(x => x.ClaimType == claim) == null )
await userMgr.AddClaimAsync(user, new Claim(claim, value));
}
但是声明部分存在问题:每次网站启动时,都会为我添加一组新声明(即,为同一用户创建重复声明)。
当我单步执行代码时,user.Claims 从来没有任何条目,即使数据库(sql 服务器)在 AspNetUserClaims 中显示相关用户的条目。
似乎 Claims 集合并未通过 FindEmailAsync 从数据库中填充。
我该如何做到这一点?
查看 UserManager 的 GetClaimsAsync 方法。明确填充您的声明集合。
user.Claims = await userMgr.GetClaimsAsync(user);
我正在为数据端使用 EF7 编写一个简单的 MVC6 应用程序,运行 在设置用户和声明方面遇到了一些问题。具体来说,我有一个数据库播种例程,用具有特定声明的特定用户(我)填充数据库中的身份表。此播种方法是从 startup.cs.
中调用的很简单:
public static async Task CreateMasterUser( UserManager<ApplicationUser> userMgr, ILogger logger )
{
var user = await userMgr.FindByEmailAsync("my email");
if( user == null )
{
user = new ApplicationUser()
{
Email = "my email",
FirstName = "blah",
LastName = "blah",
UserName = "Blah",
};
IdentityResult result = await userMgr.CreateAsync(user, "mypw");
if( !result.Succeeded )
{
logger.LogCritical("Failed to create master user. Messages were: " + String.Join("; ", result.Errors.Select(x => x.Description)));
return;
}
}
await AddClaim(user, userMgr, "user.add", "allowed");
await AddClaim(user, userMgr, "user.delete", "allowed");
await AddClaim(user, userMgr, "user.edit.self", "allowed");
await AddClaim(user, userMgr, "user.edit.all", "allowed");
await AddClaim(user, userMgr, "user.confirm", "allowed");
await AddClaim(user, userMgr, "content.add", "allowed");
await AddClaim(user, userMgr, "content.view", "allowed");
await AddClaim(user, userMgr, "content.edit", "allowed");
await AddClaim(user, userMgr, "content.delete", "allowed");
}
private static async Task AddClaim( ApplicationUser user, UserManager<ApplicationUser> userMgr, string claim, string value )
{
if( user.Claims.SingleOrDefault(x => x.ClaimType == claim) == null )
await userMgr.AddClaimAsync(user, new Claim(claim, value));
}
但是声明部分存在问题:每次网站启动时,都会为我添加一组新声明(即,为同一用户创建重复声明)。
当我单步执行代码时,user.Claims 从来没有任何条目,即使数据库(sql 服务器)在 AspNetUserClaims 中显示相关用户的条目。
似乎 Claims 集合并未通过 FindEmailAsync 从数据库中填充。
我该如何做到这一点?
查看 UserManager 的 GetClaimsAsync 方法。明确填充您的声明集合。
user.Claims = await userMgr.GetClaimsAsync(user);