Пройти аутентификацию с помощью ASP Core MVC, Web API и IdentityServer4?
Я работаю над миграцией монолитного приложения ASP Core MVC для использования дизайна архитектуры службы. Сайт MVC front-end использует HttpClient
для загрузки необходимых данных из ASP Core Web API. Небольшая часть интерфейсного приложения MVC также требует аутентификации, которая выполняется с помощью IdentityServer4 (интегрирована с back-end API). Все это отлично работает, пока я не поставлю Authorize
атрибут на контроллере или методе в веб-API. Я знаю, мне нужно как-то пройти ... авторизация пользователя от front-end до back-end, чтобы это работало, но я не уверен, как это сделать. Я попытался получить маркер доступа: User.FindFirst("access_token")
но он возвращает null. Затем я попробовал этот метод и я могу получить маркер:
var client = new HttpClient("url.com");
var token = HttpContext.Authentication.GetTokenAsync("access_token")?.Result;
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
этот метод получает токен, но по-прежнему не аутентифицируется с помощью back-end API. Я довольно новичок в этих концепциях OpenId/IdentityServer, и любая помощь будет оценена!
вот соответствующий код от клиента MVC Класс запуска:
private void ConfigureAuthentication(IApplicationBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "Cookies",
AutomaticAuthenticate = true,
ExpireTimeSpan = TimeSpan.FromMinutes(60)
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "oidc",
SignInScheme = "Cookies",
Authority = "https://localhost:44348/",
RequireHttpsMetadata = false,
ClientId = "clientid",
ClientSecret = "secret",
ResponseType = "code id_token",
Scope = { "openid", "profile" },
GetClaimsFromUserInfoEndpoint = true,
AutomaticChallenge = true, // Required to 302 redirect to login
SaveTokens = true,
TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
NameClaimType = "Name",
RoleClaimType = "Role",
SaveSigninToken = true
},
});
}
и класс запуска API:
// Add authentication
services.AddIdentity<ExtranetUser, IdentityRole>(options =>
{
// Password settings
options.Password.RequireDigit = true;
options.Password.RequiredLength = 8;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequireLowercase = true;
// Lockout settings
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
options.Lockout.MaxFailedAccessAttempts = 10;
// User settings
options.User.RequireUniqueEmail = true;
})
.AddDefaultTokenProviders();
services.AddScoped<IUserStore<ExtranetUser>, ExtranetUserStore>();
services.AddScoped<IRoleStore<IdentityRole>, ExtranetRoleStore>();
services.AddSingleton<IAuthorizationHandler, AllRolesRequirement.Handler>();
services.AddSingleton<IAuthorizationHandler, OneRoleRequirement.Handler>();
services.AddSingleton<IAuthorizationHandler, EditQuestionAuthorizationHandler>();
services.AddSingleton<IAuthorizationHandler, EditExamAuthorizationHandler>();
services.AddAuthorization(options =>
{
/* ... etc .... */
});
var serviceProvider = services.BuildServiceProvider();
var serviceSettings = serviceProvider.GetService<IOptions<ServiceSettings>>().Value;
services.AddIdentityServer() // Configures OAuth/IdentityServer framework
.AddInMemoryIdentityResources(IdentityServerConfig.GetIdentityResources())
.AddInMemoryClients(IdentityServerConfig.GetClients(serviceSettings))
.AddAspNetIdentity<ExtranetUser>()
.AddTemporarySigningCredential(); // ToDo: Add permanent SigningCredential for IdentityServer
2 ответов
добавил пакет nuget здесь и следующий код, чтобы исправить:
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "https://localhost:44348/",
ApiName = "api"
});
это позволяет API размещать IdentityServer4 и использовать себя в качестве аутентификации. Затем в MvcClient маркер носителя может быть передан API.
Да, вам нужно добавить IdentityServer4.AccessTokenValidation
пакет для вашего проекта API. И проверьте комментарии ниже
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "https://localhost:44348/", //Identity server host uri
ApiName = "api", // Valid Api resource name
AllowedScopes = scopes // scopes:List<string>
});
вы должны удалить код ниже из класса запуска API и заменить выше первый:
services.AddIdentityServer() // Configures OAuth/IdentityServer framework
.AddInMemoryIdentityResources(IdentityServerConfig.GetIdentityResources())
.AddInMemoryClients(IdentityServerConfig.GetClients(serviceSettings))
.AddAspNetIdentity<ExtranetUser>()
.AddTemporarySigningCredential();
вышеуказанный код требуется на вашем сервере идентификации, а не на API или любом другом клиенте