Пользовательская авторизация на основе ролей ASP.NET Core (Custom User.IsInRole)?

Я использую базу данных postgres через библиотеку Marten с приложением .NET. У меня есть пользовательский 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();
}

person Andrew    schedule 06.04.2017    source источник
comment
Об этом также написано в github, в ожидании ответа: github.com/aspnet/Mvc/issues/6100   -  person Andrew    schedule 10.04.2017


Ответы (1)


Хорошо, понял это после большого количества копаний. В моем случае MartenRoleStore реализовывал IUserLoginStore, ему также нужно было реализовать IUserRoleStore, у которого есть GetRolesAsync и IsInRoleAsync. (Очень важно, чтобы это был тот же класс, который вы использовали для .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

person Andrew    schedule 10.04.2017
comment
Ссылки битые :( - person endorphin; 31.05.2018
comment
Честно говоря, я не занимался .NET около года, я думаю, что эти ссылки указывали на, но понятия не имею: github.com/aspnet/Identity/blob/dev/src/Core/ github.com/aspnet/Identity/blob/dev/src/Core/ - person Andrew; 22.06.2018