Реализация ролей с настраиваемым поставщиком хранилища для удостоверений - PullRequest
0 голосов
/ 15 февраля 2020

Недавно мне удалось успешно реализовать аутентификацию (SSO с ADFS с использованием WS-Federation) для приложения. Теперь я пытаюсь понять и заставить работать авторизацию, поэтому этот вопрос может быть неясным.

Я использую эту топи c для реализации ролей с поставщиком нестандартного хранилища для идентификации без framework 1.

У меня настроены пользовательские модели User и Role, а также пользовательские UserStore и RoleStore, которые реализуют соответствующие интерфейсы. Есть также таблицы для ролей, готовых к использованию.

У меня возникают проблемы при попытке получить доступ к [Authorized] или [Authorized(Roles = "RoleName")]. Как и ожидалось, эти действия требуют от меня аутентификации с помощью ADFS, но когда я отправляю правильные учетные данные, логин зацикливается несколько раз и отображает страницу ошибки ADFS. Эта проблема с ADFS отсутствует без реализации роли. UserStore и RoleStore пока не реализуют код, но приложение никогда не пытается использовать ни один из их методов.

Я попытался реализовать различные варианты в Startup.cs, некоторые из которых я прокомментировал, и переупорядочить службы. Вставка фиктивного кода в RoleStore тоже не помогла. По сути, я просто хочу иметь возможность добавлять проверки ролей из пользовательского хранилища, используя Identity. Я могу получить имя пользователя в любое время после того, как он войдет в систему, чтобы найти свою роль.

Startup.cs ConfigureServices - метод, для которого мне наиболее неясно, и, вероятно, наиболее вероятное место, где что-то настроено неправильно .

Startup.cs ConfigureServices ():

public void ConfigureServices(IServiceCollection services)
{
    // Add identity types
    services.AddIdentity<User, Role>()
        //.AddUserManager<UserManager<User>>() // some other settings I've tried ...
        //.AddRoleManager<RoleManager<Role>>()
        //.AddUserStore<UserStore>()
        //.AddRoleStore<RoleStore>()
        //.AddRoles<Role>()
        .AddDefaultTokenProviders();

    // Identity Services
    services.AddTransient<IUserStore<User>, UserStore>();
    services.AddTransient<IRoleStore<Role>, RoleStore>();
    //for SQL connection, I'll be using a different one (not the one from the link to topic)

    //dependency injection
    services.AddScoped<ISomeService, SomeService>();

    services.AddAuthentication(sharedOptions =>
    {
        // authentication options...
    })
    .AddWsFederation(options =>
    {
        // wsfed options...
    })
    .AddCookie(options =>
    {
        options.Cookie.Name = "NameOfCookie";
        //options.LoginPath = "/Access/Login"; //app function the same without this
        options.LogoutPath = "/Access/Logout";
        options.AccessDeniedPath = "/Access/AccessDenied";
        options.ExpireTimeSpan = TimeSpan.FromMinutes(120);
        options.SlidingExpiration = true;
    });

    services.AddControllersWithViews();
}

1 Ответ

0 голосов
/ 18 февраля 2020

Еще один способ сделать это - добавить хранилище пользовательских атрибутов в ADFS.

Затем роли et c. то, что вам нужно из хранилища пользовательских атрибутов, может быть настроено как утверждение.

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