Как перенести претензии от WS-Federation ответить на личность - PullRequest
0 голосов
/ 06 июля 2018

Я довольно новичок в .net core 2.1, я подумал, что если я собираюсь построить / перестроить проект, я мог бы также использовать новую вещь. Поэтому я некоторое время боролся с идентификацией ядра ASP.NET - документация, безусловно, оставляет желать лучшего.

Я успешно ввел аутентификацию - я перенаправляю на свою ADFS и снова, и пользователи входят в систему.

Тогда я начал просматривать Авторизацию. Сначала я попробовал на основе ролей, но я прочитал, что роли не используются, и, кроме того, я не мог понять, почему роли, назначенные пользователям, не проходят проверки авторизации (ClaimsPrincipal.IsInRole и политики для страниц бритв).

Я решил использовать авторизацию на основе утверждений, полагая, что могу использовать утверждения, предоставленные через WS-Federation, - я отправляю несколько (имя, имя, адрес электронной почты, группа), где группа представляет собой неполный список членство в группах в виде строк - однако я не вижу ни одной из этих претензий в ClaimsPrincipal (HttpContext.User) после входа в систему.

прерывая поток при входе в систему, я вижу, что вызов

_signInManager.GetExternalLoginInfoAsync()

определенно получает ожидаемые претензии от ADFS, но явно не понимает, что происходит после этого.

Как я уже сказал, я довольно туманный по поводу того, как это работает внутри и TBH. На самом деле я не хочу слишком глубоко разбираться в мелочах, мне просто нужно знать, что я могу авторизоваться на основе групповых утверждений из ADFS.

Мой проект в большей или меньшей степени является стандартным веб-сайтом asp.net core 2.1 по умолчанию с выбранной авторизацией отдельных учетных записей, затем я добавил изменения для WS-Federation и присяжным выполнил действие Login для прямого перенаправления в ADFS. чем подсказать.

Пожалуйста, дайте мне знать, если вам нужно разъяснение, но суть этого:

Как получить групповые заявки из ADFS в удостоверение ядра ASP.NET , чтобы я мог ссылаться на них следующим образом:

services.AddAuthorization(options =>
            {
                options.AddPolicy("RequireAdminGroup", policy =>
                    policy.RequireClaim("Group", "AD Admin Group Name")
                );
            });

Кроме того, не стесняйтесь направлять меня на любой пропущенный мной ответ. Читал документы и искал в интернете целый день, а сегодня совсем не прогрессировал!

Ответы [ 2 ]

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

Идентификация работает правильно. Вы просто неверно оценили претензии. Попробуйте следующее внутри Razor Page.

@inject UserManager<ApplicationUser> UserManager
@{

  var claims = await UserManager.GetClaimsAsync(await UserManager.GetUserAsync(User));
}

Для политик вы можете использовать класс ClaimTypes в Startup.cs, чтобы получить хорошо известные утверждения Ex.:

policy.RequireClaim(ClaimTypes.WindowsAccountName));
0 голосов
/ 14 сентября 2018

Чтобы добавить дополнительную информацию, вот как я обошел проблему. Функция ASP.NET Core Identity была намного более тяжелой, чем я хотел / нуждался, и документации не хватало. Он также более или менее похитил претензии из источника федерации, а затем заменил их своими собственными ценностями. Поскольку мне нужно было только получить групповые заявки, отправленные ADFS, и использовать их в политиках, я сделал что-то вроде:

Удалить ВСЕ ссылки на ASP.NET Core Identity. Я не помню, что у них на макушке, но найти их должно быть довольно очевидно.

services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
        })
        .AddWsFederation(options =>
        {
            options.MetadataAddress = "https://federationservicesurl/";
            options.Wtrealm = "realmname";
            options.SignOutWreply = "https://signoutaddress if you want it";

        })
        .AddCookie(options =>
        {
            options.AccessDeniedPath = "/AccessDenied"; // If you need one
            options.ExpireTimeSpan = TimeSpan.FromMinutes(20); // Or from config
        });

Это добавляет опции аутентификации, промежуточное ПО ws-federation и файлы cookie для его работы. Затем вы добавляете Авторизацию:

            services.AddAuthorization(options =>
        {
            // Any Admins
            options.AddPolicy("RequireGroup", policy =>
                policy.RequireClaim("http://schemas.xmlsoap.org/claims/Group", "Group 1", "Group 2")
            );

            //... more policies
        }

и, наконец, вы можете использовать эти политики. В моем случае я использую Razor Pages, поэтому у меня просто есть диапазон AuthorizeFolder/AuthorizePage.

services.AddRazorPagesOptions(options =>
        {
            options.Conventions.AllowAnonymousToPage("/AccessDenied");
            options.Conventions.AllowAnonymousToPage("/SignedOut");
            options.Conventions.AllowAnonymousToPage("/SignOut");

            options.Conventions.AuthorizeFolder("/Network", "RequireGroup");
            options.Conventions.AuthorizePage("/About", "RequireGroup");

            // ... more directives
        })

И это просто работает. Если вы хотите также скрыть фрагменты интерфейса, вы можете сделать это. Опять же, я использую Razor, а не чистый MVC, поэтому я не уверен, как реализовать это способом MVC, но я делаю это в моем файле cshtml вверху:

@inject IAuthorizationService AuthorizationService
@{
    var requiregroup= (await AuthorizationService.AuthorizeAsync(User, "RequireGroup"));
}

и затем:

@if (requiregroup.Succeeded)
{
    <div>some content that requires the policy RequireGroup</div>
}

Очевидно, что если вы скрываете ссылки / и т. Д. От страницы, вам также необходимо иметь политики, предотвращающие доступ этого пользователя к реальным ссылкам, поскольку ничто не мешает пользователю просто пытаться получить доступ к любому старому пути.

И вот как я это реализовал. Если у кого-то есть какие-либо отзывы, чтобы сказать мне, что я сделал что-то ужасно неправильно, я открыт для этого:)

...