Как добавить претензии к пользователю Windows - PullRequest
0 голосов
/ 12 июня 2018

У меня есть приложение API ядра dotnet с включенным приложением Windows.У нас есть группа пользователей, которые имеют специальное разрешение «admin» и хранятся в базе данных, остальные имеют разрешение по умолчанию «user».Я хочу, чтобы у пользователей были дополнительные претензии, которые все есть в базе данных.Также я хочу сохранить больше информации, такой как emailid, номер сотрудника (который я должен запросить из LDAP вручную)

Я думал, что у меня будет один API, скажем api/auth, который будет захватывать текущего пользователя и добавлятьзаявки, основанные на базе данных, запросе ldap и других конечных точках API, могут использовать его.

Но я не могу понять, как добавлять и сохранять заявки между различными конечными точками API.

Возможно ли этои или это хороший способ?У меня есть второй вариант попадания в базу данных при каждом вызове API.

Редактировать 1: Я написал промежуточное программное обеспечение, которое перехватывает все запросы API и выполняет поиск в LDAP / базе данных, создает ClaimsIndentity и добавляет его в Users.Identity,Затем он доступен через оставшуюся часть звонка.

Редактировать 2: Когда я получаю ответ @Ondra Starenko, я не могу сослаться на IClaimsTransformer или app.UseClaimsTransformation.Есть ли что-то еще, что мне нужно включить.

Платформа: .NET core 2.1.3

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

В .NET Core 2+ IClaimsTransformer устарел.Вместо этого используйте IClaimsTransformation:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;

public class ClaimsTransformer : IClaimsTransformation
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var ci = (ClaimsIdentity) principal.Identity;
        var c = new Claim(ci.RoleClaimType, "Admin");
        ci.AddClaim(c);
        return Task.FromResult(principal);
    }
}

Также обратите внимание, что вы не должны использовать "ClaimTypes.Role".Вы должны использовать ci.RoleClaimType - особенно если у вас включена аутентификация Windows.При проверке подлинности Windows ci.RoleClaimType оценивает некоторое строковое значение, которое будет правильно выбрано в качестве роли, тогда как ClaimTypes.Role не будет.

Наконец, добавьте ваш ClaimsTransformer, добавив его в метод ConfigureServices в Startup.cs:

services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();

Теперь вы сможете добавлять атрибуты авторизации на основе ролей в ваши методы контроллера, и теперь они будут оцениваться правильно:

[Authorize(Roles = "Admin")]
[HttpGet("[action]/{id}")]        
public User GetUser([FromRoute] int id)
{
    UserLogic ul = new UserLogic();
    return ul.GetUser(id);
}
0 голосов
/ 25 июня 2018

Вы можете добавить Заявки пользователю Windows в классе ClaimsTransformer.

public class ClaimsTransformer : IClaimsTransformer
{
   public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
   {
      //add new claim
      var ci = (ClaimsIdentity) context.Principal.Identity;
      var c = new Claim(ClaimTypes.Role, "admin");
      ci.AddClaim(c);

      return Task.FromResult(context.Principal);
   }
}

И добавить эту строку в Автозагрузку:

app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o));

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
   loggerFactory.AddConsole(LogLevel.Debug);
   loggerFactory.AddDebug();

   app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o));

   app.UseStaticFiles();

   app.UseMvc();
}

Для получения дополнительной информации см .: добавление претензий к идентификатору Windows .

...