ASP.NET Core - авторизация с использованием аутентификации Windows - PullRequest
0 голосов
/ 28 ноября 2018

Я настроил свой веб-API для работы с аутентификацией Windows.Моя цель по сути ограничить определенные действия в моих контроллерах на основе учетной записи Windows пользователя.Некоторые из них смогут предварительно выполнить действия чтения, а другие смогут выполнить действия, которые будут записаны в базовую базу данных.Я нашел много документации о том, как настроить авторизацию на основе утверждений, которая, как мне кажется, должна пройти.Чего я не нашел, так это как настроить Windows Auth.Я думаю, что мне не хватает среднего шага, такого как регистрация Windows Auth в качестве поставщика удостоверений?

startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthentication(IISDefaults.AuthenticationScheme);

    services.AddAuthorization(options =>
    {
        options.AddPolicy("readOnly", policy =>
                          policy.RequireClaim(`???????????????????????`));
        options.AddPolicy("write", policy =>
                          policy.RequireClaim(`???????????????????????`));
    });
}

Контроллер

[Authorize(Policy = "ReadOnly")]
public class MyController : Controller
{
    public ActionResult SomeReadOnlyAction()
    {
        //Return data from database
    }

    [Authorize(Policy = "Write")]
    public ActionResult AWriteAction()
    {
        //Create/Update/Delete data from database
    }
}

Я думаю, что другой способ задать этот вопрос, какВы настраиваете или получаете доступ к утверждениям / ролям и т. д. с помощью аутентификации Windows.

1 Ответ

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

Кажется, вы хотите использовать авторизацию на основе утверждений через политики.После настройки проверки подлинности Windows в своем приложении вы можете добавить пользовательскую заявку в ClaimsPrincipal, проверить личность пользователя и подтвердить, какое разрешение имеет текущий пользователь:

  1. Вы можете добавить службу преобразования заявок в свое приложение:

    class ClaimsTransformer : IClaimsTransformation
    {
        public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            var id = ((ClaimsIdentity)principal.Identity);
    
            var ci = new ClaimsIdentity(id.Claims, id.AuthenticationType, id.NameClaimType, id.RoleClaimType);
            if (ci.Name.Equals("name"))
            {
                ci.AddClaim(new Claim("permission", "readOnly"));
            }
            else
            {
                ci.AddClaim(new Claim("permission", "write"));
    
            }
    
    
            var cp = new ClaimsPrincipal(ci);
    
            return Task.FromResult(cp);
        }
    }
    
  2. Добавить в Startup.cs (.net Core 2.0):

        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
    
  3. Установить свою политику:

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Readonly", policy =>
                              policy.RequireClaim("permission", "readOnly"));
    
            options.AddPolicy("Write", policy =>
                            policy.RequireClaim("permission", "write"));
        });
    
  4. Ограничить доступ к контроллеру или действию, требуя этой политики:

        [Authorize(Policy = "Write")]
        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";
    
            return View();
        }
    

Если вы уже добавили группы (запись, чтение только) вВаше объявление и добавить связанных пользователей в группу, вы также можете проверить группы:

public static class Security
{
    public static bool IsInGroup(this ClaimsPrincipal User, string GroupName)
    {
        var groups = new List<string>();

        var wi = (WindowsIdentity)User.Identity;
        if (wi.Groups != null)
        {
            foreach (var group in wi.Groups)
            {
                try
                {
                    groups.Add(group.Translate(typeof(NTAccount)).ToString());
                }
                catch (Exception)
                {
                    // ignored
                }
            }
            return groups.Contains(GroupName);
        }
        return false;
    }
}

И использовать как:

 if (User.IsInGroup("GroupName"))
 {

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...