Я спросил question раньше, и ответ, который был дан, был правильным, но чем дальше я спускаюсь с этой кроличьей дыры, тем больше я понимаю; Я не думаю, что задал правильный вопрос.
Позвольте мне объяснить это самым простым термином, я могу... У меня есть одностраничное приложение AngularJS (клиент), которое указывает на сайт asp.net webapi (OWIN) (сервер ресурсов?) и отдельный Сервер авторизации/аутентификации asp.net.
Сервер auth обеспечит аутентификацию и авторизацию для нескольких приложений. Мне нужно иметь возможность использовать атрибут Authorize на сервере ресурсов, а также получить токен из angular. Мне также нужно использовать проверку подлинности Windows (интегрированную) для всего, без имен пользователей или паролей. Информация о претензиях хранится в базе данных и должна быть добавлена в токен.
Я выполнил реализацию авторизации в стиле SSO в ядре asp.net, используя openiddict с JwtBearerToken и "поток паролей"? И хотел попытаться сделать что-то подобное (токен и т.д.). У меня есть базовое понимание того, как это работает с моего предыдущего внедрения, но я полностью потерялся, пытаясь понять, как заставить JWT работать с Windows Auth. Ответ на мой предыдущий вопрос дал несколько хороших предложений, но мне нелегко видеть, как это применимо в этом сценарии.
В настоящее время я пытаюсь получить IdentityServer3 для этого, используя расширения WindowsAuthentication, в основном извлекаемые из образцов. Но я действительно пытаюсь связать это вместе с клиентом и фактически получить что-то работающее. Текущий код клиента и сервера ниже, помните, что я действительно не знаю, насколько это близко к правильному решению.
Клиент:
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Passive,
AuthenticationType = "windows",
Authority = "http://localhost:21989",
ClientId = "mvc.owin.implicit",
ClientSecret = "api-secret",
RequiredScopes = new[] { "api" }
});
AuthServer:
app.Map("/windows", ConfigureWindowsTokenProvider);
app.Use(async (context, next) =>
{
if (context.Request.Uri.AbsolutePath.EndsWith("/token", StringComparison.OrdinalIgnoreCase))
{
if (context.Authentication.User == null ||
!context.Authentication.User.Identity.IsAuthenticated)
{
context.Response.StatusCode = 401;
return;
}
}
await next();
});
var factory = new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get());
var options = new IdentityServerOptions
{
SigningCertificate = Certificate.Load(),
Factory = factory,
AuthenticationOptions = new AuthenticationOptions
{
EnableLocalLogin = false,
IdentityProviders = ConfigureIdentityProviders
},
RequireSsl = false
};
app.UseIdentityServer(options);
private static void ConfigureWindowsTokenProvider(IAppBuilder app)
{
app.UseWindowsAuthenticationService(new WindowsAuthenticationOptions
{
IdpReplyUrl = "http://localhost:21989",
SigningCertificate = Certificate.Load(),
EnableOAuth2Endpoint = false
});
}
private void ConfigureIdentityProviders(IAppBuilder app, string signInAsType)
{
var wsFederation = new WsFederationAuthenticationOptions
{
AuthenticationType = "windows",
Caption = "Windows",
SignInAsAuthenticationType = signInAsType,
MetadataAddress = "http://localhost:21989",
Wtrealm = "urn:idsrv3"
};
app.UseWsFederationAuthentication(wsFederation);
}
EDIT: я вижу запросы конечных точек auth для "/.well-known/openid-configuration", а также "/.well-known/jwks", и у меня есть атрибут Authorize при вызове контроллера, который вызывается, но я не вижу ничего другого, что происходит на стороне авторизации. Я также добавил внедрение ICustomClaimsProvider в usewindowsauthservice WindowsAuthenticationOptions, но это даже не вызвано.