Недавно мне удалось успешно реализовать аутентификацию (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();
}