我是一名ASP.NET核心初学者.我陷入了角色,主张和用户关系的困境.
我有一个用户Ben,用户属于Admin角色.管理员角色在数据库中具有声明视图页面和编辑页面.
但我无法获得属于该用户的声明和角色:
(请参阅代码中的评论)
var user = await _userManager.FindByNameAsync(applicationUser.UserName);
if(user != null) {
var userClaims = await _userManager.GetClaimsAsync(user); // empty, WHY ?
var userRoles = await _userManager.GetRolesAsync(user); // ['admin']
var adminRole = DbContext.Roles.FirstOrDefault(x => x.Name == "Admin");
IList<Claim> adminClaims;
if(adminRole != null)
{
adminClaims = await _roleManager.GetClaimsAsync(adminRole);
// correct => ['view-page', 'edit-page']
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我理解当用户是某个角色的成员时,他会继承该角色的声明.
默认ASP.NET标识有5个表:
我认为对吗?为什么userManager.GetClaimsAsync(user)返回空索赔?
有什么建议吗?
我按照 openiddict 服务器示例中的说明使用https://github.com/openiddict/openiddict-samples/tree/master/samples/PasswordFlow中的密码流 但没有成功。
它抛出InvalidOperationException: 无法从此端点在路由/connect/token返回 OpenID Connect 响应:
return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
邮递员参数:
我花了一天时间进行研究,但没有关于无法从此端点异常返回的信息。除了我之外,很多人都可以运行 openiddict 示例。
这是 Startup.cs 的一部分:
services.AddEntityFrameworkSqlite()
.AddDbContext<MisapayContext>(options =>
{
options.UseOpenIddict<int>();
});
//....
services.AddOpenIddict<int>()
.AddEntityFrameworkCoreStores<MisapayContext>()
.DisableHttpsRequirement()
.EnableTokenEndpoint("/connect/token")
.EnableLogoutEndpoint("/connect/logout")
.EnableUserinfoEndpoint("/connect/userinfo")
.UseJsonWebTokens()
.AllowPasswordFlow()
.AllowRefreshTokenFlow()
.AddEphemeralSigningKey();
services.AddMvc(config =>
{
config.Filters.Add(new ApiExceptionFilter());
}).AddJsonOptions(options =>
{
options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
});
Run Code Online (Sandbox Code Playgroud)
编辑:我认为问题是OpenIdConnectRequest,如果使用它则无法绑定:
OpenIddictBuiler.AddMvcBinders()
将抛出无法从 ASP.NET 上下文检索 OpenID Connect 请求。
否则,去掉它,AuthorizationController中的OpenIdConnectRequest就可以正常获取。我可以获取请求信息,例如用户名、密码 grantType 等...奇怪...对吧?
其他一些信息:
我有两张桌子,书和章节.一本书有很多章节.
书籍型号:
public function chapters() {
return $this->hasMany(Chapter::class);
}
Run Code Online (Sandbox Code Playgroud)
章模型:
public function book() {
return $this->belongsTo(Book::class);
}
Run Code Online (Sandbox Code Playgroud)
我希望使用单个查询获得带有自己最新章节的图书清单,如下所示:
$books = Book::with(['authors', 'categories', 'chapters' => function($q) {
$q->orderBy('updated_at', 'desc')->first();
}]->get();
Run Code Online (Sandbox Code Playgroud)
但它不起作用.章节返回一个空数组.如果我删除子查询中的first(),它可以正常工作.
有没有办法只用一个查询来做到这一点.我不希望得到所有相关的章节然后保留一个,或使用多个查询.我感觉更好的唯一方法是使用join,是不是?
任何帮助将不胜感激.谢谢!