2017-04-06 127 views
2

我通过名为Marten的库与.NET应用程序一起使用postgres数据库,我有一个自定义IUserLoginStore,它管理检索用户及其角色。这似乎工作正常,但我有设置授权问题。ASP.NET核心自定义基于角色的授权(自定义User.IsInRole)?

我使用认证通过谷歌和它工作正常:

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

发布有关此内容github上为好,正在等待回应:https://github.com/aspnet/Mvc/issues/6100 – Andrew

回答

4

好吧想通了大量的挖掘后,在我的情况下MartenRoleStore正在实施IUserLoginStore它也需要实施IUserRoleStore具有GetRolesAsyncIsInRoleAsync(这是它必须是您用于.AddUserStore <>()完全相同的类非常重要的;)

这是我发现,造成这一问题的代码:

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