Этот вопрос будет разрешен через два дня, но до этого мне нужна помощь.
Я запускаю два проекта в одном решении. Один из них — мой поставщик идентификаторов (я использую IDS4), а другой — простой клиент MVC (с двумя методами на контроллере — Home/Open и Home/Secured). , Последний украшен атрибутом Авторизовать.
Когда я пытаюсь получить доступ к открытому, он ведет себя как положено. Защищенный, однако, выдает мне ошибку 401, но не возвращается на страницу входа. Я совершенно уверен, что упустил что-то важное в настройке клиента или сервера.
На стороне поставщика идентификаторов у меня есть следующее.
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultTokenProviders();
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryApiResources(ApiResources)
.AddInMemoryClients(Clients)
.AddTestUsers(Users)
.AddInMemoryIdentityResources(IdentityResources);
services.AddAuthentication()
.AddJwtBearer(_ =>
{
_.Authority = "https://localhost:5000";
_.Audience = "http://localhost:5001";
});
}
public IEnumerable<Client> Clients => new[]
{
new Client
{
ClientId = "MvcClient",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
AllowOfflineAccess = true,
RequireConsent = false,
ClientSecrets = { new Secret("MvcSecret".Sha256(), DateTime.Now.AddMinutes(2)) },
RedirectUris = { "http://localhost:5000/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:5002/" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
}
}
};
Я убедился, что ввод вручную http://localhost:5000/signin-oidc/ я увижу расположенный там документ index.html. Я ожидал, что когда я попытаюсь получить доступ к защищенной странице, я попаду туда. Вместо этого я получаю только простую ошибку 401.
На стороне клиента MVC у меня есть следующее.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(_ =>
{
_.Authority = "http://localhost:5000";
_.Audience = "http://localhost:5002";
_.SaveToken = true;
_.RequireHttpsMetadata = false;
_.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true };
})
.AddOpenIdConnect(_ => { _.ClientId = "mvc_client"; });
}
Мне нужно выяснить, почему он не отправляет меня на страницу входа в систему, как указано. Мне также нужно придумать способ входа и аутентификации с использованием JWT в MVC. Я благодарен, если я хотя бы получу предложение о том, как устранить неполадки и/или сравнить с правильным поведением. Было бы здорово иметь рабочий пример.
Я исследовал его в течение нескольких дней, и мое мнение таково, что официальное руководство неясно, начинает устаревать и, что является наиболее запутанной частью, немного перескакивает между темами без красной нити. Все примеры и блоги, которые я видел (а я видел много), не будут работать на моей машине или окажутся недействительными для последней версии .NET Core (на данный момент это 2.2). ближайший тоже не работал, и я подозреваю, что нет смысла тратить время на устранение неполадок. .