ASP.NET核心自定义基于角色的授权(Custom User.IsInRole)?

时间:2017-04-06 21:51:14

标签: asp.net authorization .net-core coreclr

我通过名为Marten的库使用postgres数据库和.NET应用程序,我有一个自定义IUserLoginStore来管理检索用户及其角色。这似乎工作正常,但我在设置授权时遇到问题。

我正在通过谷歌使用身份验证,它运行正常:

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();
}

1 个答案:

答案 0 :(得分:5)

好的,经过大量的挖掘后想出来,在我的情况下MartenRoleStore正在实施IUserLoginStore,它还需要实施IUserRoleStore GetRolesAsync和{{} 1}}。 (这非常重要,它必须与您用于.AddUserStore&lt;&gt;();)的完全相同的类。)

这是我发现导致问题的代码:

https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/UserManager.cs#L258

这就是它的工作原理:

https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/UserClaimsPrincipalFactory.cs#L96