小编tri*_*nvh的帖子

ASP.NET核心身份角色,声明和用户

我是一名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个表:

  • 用户.
  • 角色.
  • UserRoles - 用户可以拥有多个角色.
  • RoleClaims - 一个角色可以有很多声明.
  • UserClaims - 用户可以拥有多个声明.

我认为对吗?为什么userManager.GetClaimsAsync(user)返回空索赔?

有什么建议吗?

claims-based-identity asp.net-identity asp.net-core

12
推荐指数
1
解决办法
6753
查看次数

ASP.NET Core Openiddict 抛出“无法从此端点返回 OpenID Connect 响应”

我按照 openiddict 服务器示例中的说明使用https://github.com/openiddict/openiddict-samples/tree/master/samples/PasswordFlow中的密码流 但没有成功。

它抛出InvalidOperationException: 无法从此端点在路由/connect/token返回 OpenID Connect 响应

return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);

邮递员参数:

  • 内容类型: application/x-www-form-urlencoded
  • 参数:用户名=..&密码=...&grantType=密码&范围=offline_access+个人资料+电子邮件

我花了一天时间进行研究,但没有关于无法从此端点异常返回的信息。除了我之外,很多人都可以运行 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 等...奇怪...对吧?

其他一些信息:

  • Asp.net核心SDK 1.1 …

asp.net-core openiddict

5
推荐指数
1
解决办法
3836
查看次数

Laravel雄辩获得最新一排相关表格

我有两张桌子,章节.一本书有很多章节.

书籍型号:

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,是不是?

任何帮助将不胜感激.谢谢!

join relationship laravel eloquent

4
推荐指数
2
解决办法
2407
查看次数