ASP.NET 基于核心自定义角色的授权(自定义 User.IsInRole)?
ASP.NET Core Custom Role Based Authorization (Custom User.IsInRole)?
我通过名为 Marten 的库和 .NET 应用程序使用 postgres 数据库,我有一个自定义 IUserLoginStore
来管理检索用户及其角色。这似乎工作正常,但我在设置授权时遇到问题。
我正在通过 google 使用身份验证并且工作正常:
var info = await _signInManager.GetExternalLoginInfoAsync();
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
此操作引发访问被拒绝问题:
[HttpPost()]
[Authorize(Roles = "Admin")]
public JsonResult SubmitArticle([FromBody] ArticleInputModel input) {...}
我已经深入研究了授权代码,问题似乎出在默认的 ClaimsPrincipal
代码上:
public virtual bool IsInRole(string role)
{
return false;
}
我是否应该实施我自己的 ClaimsPrinciple
版本并覆盖 IsInRole
,如果我这样做,我该如何将其恢复到应用程序中?
private static void ConfigureSecurity(IServiceCollection services)
{
services.AddIdentity<User, Role>()
.AddUserValidator<UserValidator>()
.AddUserStore<MartenUserStore>()
.AddRoleStore<MartenRoleStore>()
.AddDefaultTokenProviders();
}
好吧,经过大量挖掘后发现,在我的例子中,MartenRoleStore
正在实施 IUserLoginStore
它还需要实施 IUserRoleStore
,其中有 GetRolesAsync
和IsInRoleAsync
。 (这非常重要,它必须与您用于 .AddUserStore<>(); 的 class 完全相同)
这是我发现导致问题的代码:
https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/UserManager.cs#L258
这就是它的工作原理:
我通过名为 Marten 的库和 .NET 应用程序使用 postgres 数据库,我有一个自定义 IUserLoginStore
来管理检索用户及其角色。这似乎工作正常,但我在设置授权时遇到问题。
我正在通过 google 使用身份验证并且工作正常:
var info = await _signInManager.GetExternalLoginInfoAsync();
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
此操作引发访问被拒绝问题:
[HttpPost()]
[Authorize(Roles = "Admin")]
public JsonResult SubmitArticle([FromBody] ArticleInputModel input) {...}
我已经深入研究了授权代码,问题似乎出在默认的 ClaimsPrincipal
代码上:
public virtual bool IsInRole(string role)
{
return false;
}
我是否应该实施我自己的 ClaimsPrinciple
版本并覆盖 IsInRole
,如果我这样做,我该如何将其恢复到应用程序中?
private static void ConfigureSecurity(IServiceCollection services)
{
services.AddIdentity<User, Role>()
.AddUserValidator<UserValidator>()
.AddUserStore<MartenUserStore>()
.AddRoleStore<MartenRoleStore>()
.AddDefaultTokenProviders();
}
好吧,经过大量挖掘后发现,在我的例子中,MartenRoleStore
正在实施 IUserLoginStore
它还需要实施 IUserRoleStore
,其中有 GetRolesAsync
和IsInRoleAsync
。 (这非常重要,它必须与您用于 .AddUserStore<>(); 的 class 完全相同)
这是我发现导致问题的代码:
https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/UserManager.cs#L258
这就是它的工作原理: