Вопросы с тегами [openiddict]

0

голосов
0

ответ
18

Просмотры

Как интегрировать Social Войти с помощью существующего .Net ядра Web API бэкэнда и угловой SPA фронтэнда с рабочей OpenIddict пользователя / паролем и каналом передачи маркерами

TL; DR Вопрос: как реализовать социальный логин (OAuth2 потока авторизации) с существующим приложением SPA / Web API, который основан на личных данных, пользователя / пароль, однонаправленного маркера аутентификации? У меня есть существующее приложение, который имеет: Backend: .Net Core 2 Web API с идентификацией и OpenIddict услугами, сконфигурированное, с процессом аутентификации рабочей на основе пароля пользователя / вызов для однонаправленных маркеров. Пользователи сохраняются с Идентичность (AspNetUsers). Часть кода Startup.cs // Зарегистрировать OpenIddict услуги. services.AddOpenIddict () .AddCore (опции => {options.UseEntityFrameworkCore () UseDbContext ();.}) .AddServer (опции => {options.UseMvc (); options.EnableTokenEndpoint ( "/ подключить / маркер"); опции .AllowPasswordFlow (); options.AllowRefreshTokenFlow (); опция. AcceptAnonymousClients (); options.RegisterScopes (OpenIdConnectConstants.Scopes.OpenId, OpenIdConnectConstants.Scopes.Email, OpenIdConnectConstants.Scopes.Phone, OpenIdConnectConstants.Scopes.Profile, OpenIdConnectConstants.Scopes.OfflineAccess, OpenIddictConstants.Scopes.Roles); }) .AddValidation (); , Frontend: SPA Угловое 7 приложение, которое потребляет этот бэкэнд API и токенов авторизации Таким образом, в основном текущие настройки, пользователь вводит пользователь / пароль в SPA, который вызывает бэкенд / подключения / маркер конечной точки, которая проверяет учетные данные и генерирует маркер для клиента. А теперь мне нужно интегрировать Social Login (OAuth2 поток авторизации), так что пользователь выбирает логин с провайдером, перенаправляется на страницу авторизации поставщиков, получает перенаправляется обратно к моему заявлению, которое должно создать идентификатор пользователя и сохранять данные идентичности UserLoginInfo и предоставить мой маркер приложения, так что пользователь может войти в систему. Я понимаю, поток авторизации OAuth2, что необходимо запросить код авторизации, а затем Обмен код авторизации для доступа Токена для этого провайдера. Я также знаю, что этот поток должен использовать бэкенд, когда он использует конфиденциальную информацию, как client_secret, которые не могут быть сохранены в стороне клиента. Но в какой-то момент пользователь должен взаимодействовать с веб-интерфейсе, так, соединяющим эти части, кажется, очень трудно, учитывая, что они широко используются технологии. Все практические примеры, которые я нашел на Google, были с помощью приложения .Net ядра MVC. Я также нашел эту статью ASP.N Co, 3. 0 Preview 4 - Аутентификация и авторизация для ООР, что кажется перспективным, но все еще в режиме предварительного просмотра 4. Я уже создал социальные приложения провайдеров и я client_id, client_secret. Кроме того, зарегистрировавшись мои других страниц URL. То, что я пытался без успеха было: В пользователь фронтэнда выбирает войти в системе с социальным провайдером, пользователь перенаправляется на страницу авторизации провайдера, аутентифицирует себя и перенаправляется от поставщика к моему фронтэнду URL (redirect_uri) с кодом поставщика тогда мой интерфейс называет мой бэкенд / Связь / маркер существующей конечной точки прохождения выбранного поставщика и полученный код, конечная точка была запрограммирована, чтобы получить у поставщика и код также, то мой бэкенд называет получить маркер доступа URL-адрес проводки «grant_type», «authorization_code» «код», код «redirect_uri провайдера "" providerSecret и получает StatusCode: 401, ReasonPhrase: «Несанкционированный» ответ Что я делаю неправильно? Это было очень трудно время, чтобы получить эту работу. То, что работало, но это не то, что мне нужно неявный 2 шага поток авторизации, используя внешний интерфейс для вызовов аутентификации провайдера и вызов бэкэнда, чтобы получить мой предъявителю маркера и создать идентификатор пользователь. С этим пользователем установка сделал успешную регистрацию с помощью социального провайдера, к сожалению, это не то, что мне нужно EDIT: Составила схему того, что будет реализован, оно терпит неудачу на этапе 5/6 с StatusCode: 401, ReasonPhrase: «Несанкционированные» и дальнейшие шаги не завершены. providerSecret и получает StatusCode: 401, ReasonPhrase: «Несанкционированный» ответ Что я делаю неправильно? Это было очень трудно время, чтобы получить эту работу. То, что работало, но это не то, что мне нужно неявный 2 шага поток авторизации, используя внешний интерфейс для вызовов аутентификации провайдера и вызов бэкэнда, чтобы получить мой предъявителю маркера и создать идентификатор пользователь. С этим пользователем установка сделал успешную регистрацию с помощью социального провайдера, к сожалению, это не то, что мне нужно EDIT: Составила схему того, что будет реализован, оно терпит неудачу на этапе 5/6 с StatusCode: 401, ReasonPhrase: «Несанкционированные» и дальнейшие шаги не завершены. не то, что мне нужно неявный 2 шага поток авторизации, используя внешний интерфейс для вызовов аутентификации провайдера и вызов бэкэнда, чтобы получить мой предъявителю маркера и создать идентификатор пользователь. С этим пользователем установка сделал успешную регистрацию с помощью социального провайдера, к сожалению, это не то, что мне нужно EDIT: Составила схему того, что будет реализован, оно терпит неудачу на этапе 5/6 с StatusCode: 401, ReasonPhrase: «Несанкционированные» и дальнейшие шаги не завершены. не то, что мне нужно неявный 2 шага поток авторизации, используя внешний интерфейс для вызовов аутентификации провайдера и вызов бэкэнда, чтобы получить мой предъявителю маркера и создать идентификатор пользователь. С этим пользователем установка сделал успешную регистрацию с помощью социального провайдера, к сожалению, это не то, что мне нужно EDIT: Составила схему того, что будет реализован, оно терпит неудачу на этапе 5/6 с StatusCode: 401, ReasonPhrase: «Несанкционированные» и дальнейшие шаги не завершены.
Fernando Ribeiro
1

голосов
1

ответ
583

Просмотры

OpenID Connect сервер. Сформировать маркер доступа, основанный на 3-й знак партии (социальный Логин)

Я реализовал сервер OpenID Connect, который генерирует маркеры доступа для мобильного клиента на основе имени пользователя / пароля, используя OpenIddict. Моя следующая цель состояла в том, чтобы обеспечить возможность генерировать маркер доступа с использованием 3-й партии жетоны (социальный логин, например), и я начал от интеграции с маркером Google, но застрял, как не может найти какие-либо образцы / информацию о том, как это сделать. Только одна мысль, что я в настоящее время, чтобы сделать запрос на «/ подключения / маркер» конечной точки и отправить маркер Google в параметре «код», например, в «Google:» формат, а затем переопределить метод OpenIdConnectServerProvider.DeserializeAuthorizationCode: Вызывается при приеме Код авторизации. ticket.SetPresenters (context.Request.ClientId); context.Ticket = билет; context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays (1); context.HandleResponse (); ждут _signInService.Login (основной); вернуть; } Еще {base.DeserializeAuthorizationCode (контекст); }}, Где GoogleTokenValidator является пользовательский класс для Google лексемы обработки (это делает вызов Google Информация о пользователе конечной точки и генерировать ClaimsPrincipal), основанный на «копировать-вставить» код из класса GoogleHandler в репо САШ / безопасности. В целом она работает с некоторыми дополнительными писак, но у меня есть стойкое ощущение, что изобретать колесо ... context.HandleResponse (); ждут _signInService.Login (основной); вернуть; } Еще {base.DeserializeAuthorizationCode (контекст); }}, Где GoogleTokenValidator является пользовательский класс для Google лексемы обработки (это делает вызов Google Информация о пользователе конечной точки и генерировать ClaimsPrincipal), основанный на «копировать-вставить» код из класса GoogleHandler в репо САШ / безопасности. В целом она работает с некоторыми дополнительными писак, но у меня есть стойкое ощущение, что изобретать колесо ... context.HandleResponse (); ждут _signInService.Login (основной); вернуть; } Еще {base.DeserializeAuthorizationCode (контекст); }}, Где GoogleTokenValidator является пользовательский класс для Google лексемы обработки (это делает вызов Google Информация о пользователе конечной точки и генерировать ClaimsPrincipal), основанный на «копировать-вставить» код из класса GoogleHandler в репо САШ / безопасности. В целом она работает с некоторыми дополнительными писак, но у меня есть стойкое ощущение, что изобретать колесо ... }}, Где GoogleTokenValidator является пользовательский класс для Google лексемы обработки (это делает вызов Google Информация о пользователе конечной точки и генерировать ClaimsPrincipal), основанный на «копировать-вставить» код из класса GoogleHandler в репо САШ / безопасности. В целом она работает с некоторыми дополнительными писак, но у меня есть стойкое ощущение, что изобретать колесо ... }}, Где GoogleTokenValidator является пользовательский класс для Google лексемы обработки (это делает вызов Google Информация о пользователе конечной точки и генерировать ClaimsPrincipal), основанный на «копировать-вставить» код из класса GoogleHandler в репо САШ / безопасности. В целом она работает с некоторыми дополнительными писак, но у меня есть стойкое ощущение, что изобретать колесо ...
Set
1

голосов
1

ответ
962

Просмотры

OpenIDDict в основных ошибках asp.net «Запрос OpenID Connect не может быть восстановлен»

System.InvalidOperationException: Запрос OpenID Connect не может быть извлечен из контекста ASP.NET. Убедитесь в том, что "app.UseOpenIddict () вызывается до 'app.UseMvc ()' и что маршрут действия соответствует пути конечной зарегистрированной с помощью«services.AddOpenIddict (). Enable [...] Endpoint (... ). в OpenIddict.Mvc.OpenIddictModelBinder.BindModelAsync (ModelBindingContext контекст) MyStartup.cs общественных недействительных ConfigureServices (услуги IServiceCollection) {services.AddApplicationInsightsTelemetry (Конфигурация); services.AddDbContext (опции => options.UseSqlServer (Configuration.GetConnectionString ( "DefaultConnection"))); services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders (); services.AddMvc (); , AddMvcBinders () .EnableAuthorizationEndpoint ( "/ подключения / авторизовать") .EnableLogoutEndpoint ( "/ подключения / выхода из системы") .EnableTokenEndpoint ( "/ подключения / маркер") .EnableUserinfoEndpoint ( "/ счета / USERINFO") .AllowAuthorizationCodeFlow () .AllowPasswordFlow ( ) .AllowRefreshTokenFlow () .RequireClientIdentification () // Во время разработки, вы можете отключить требование HTTPS. .DisableHttpsRequirement () .AddEphemeralSigningKey (); services.AddTransient (); services.AddTransient (); } Общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment ENV, ILoggerFactory loggerFactory) {loggerFactory.AddConsole (Configuration.GetSection ( "Вход")); loggerFactory.AddDebug (); приложение. UseApplicationInsightsRequestTelemetry (); если (env.IsDevelopment ()) {app.UseDeveloperExceptionPage (); app.UseDatabaseErrorPage (); app.UseBrowserLink (); } Еще {app.UseExceptionHandler ( "/ Home / Error"); } App.UseApplicationInsightsExceptionTelemetry (); app.UseStaticFiles (); app.UseCsp (опции => options.DefaultSources (директива => directive.Self ()) .ImageSources (директива => directive.Self () .CustomSources ( "*")) .ScriptSources (директива => directive.Self () .UnsafeInline ()) .StyleSources (директива => directive.Self () .UnsafeInline ())); app.UseXContentTypeOptions (); app.UseXfo (опции => options.Deny ()); app.UseXXssProtection (Настройки => Настройки. EnabledWithBlockMode ()); app.UseIdentity (); // Добавление промежуточного уровня, используемые для проверки доступа // маркеров и защиты API конечных точек. app.UseOAuthValidation (); app.UseGoogleAuthentication (новые GoogleOptions {}); app.UseStatusCodePagesWithReExecute ( "/ ошибка"); app.UseOpenIddict (); app.UseMvcWithDefaultRoute (); } Обновление с помощью System.Linq; используя System.Security.Claims; используя System.Threading.Tasks; используя AspNet.Security.OpenIdConnect.Extensions; используя AspNet.Security.OpenIdConnect.Server; используя Microsoft.AspNetCore.Authentication; используя Microsoft.AspNetCore.Authorization; используя Microsoft.AspNetCore.Http.Authentication; используя Microsoft.AspNetCore.Identity; используя Microsoft.AspNetCore.Mvc; используя Mvc.Server.Models; используя Mvc.Server.ViewModels.Authorization; используя Mvc.Server.ViewModels.Shared; используя OpenIddict; AuthorizationController общественного класса: контроллер {частный OpenIddictApplicationManager _applicationManager только для чтения; частное чтение SignInManager _signInManager; частное чтение UserManager _userManager; общественного AuthorizationController (OpenIddictApplicationManager applicationManager, SignInManager signInManager, UserManager userManager) {_applicationManager = applicationManager; _signInManager = signInManager; _userManager = userManager; } // Примечание: для поддержки интерактивных потоков, таких как поток кода, // Вы должны предоставить свои собственные действия конечной точки авторизации: [санкционировать HttpGet, пути ( «~ / подключение / авторизовать»)] общественный асинхронном Task авторизовать (запрос OpenIdConnectRequest) { // Получить подробную информацию приложения из базы данных. приложение вар = ждут _applicationManager.FindByClientIdAsync (request.ClientId); если (приложение == NULL) {вернуться View ( "Ошибка", новый ErrorViewModel {Error = OpenIdConnectConstants.Errors.InvalidClient, ErrorDescription = "Подробная информация о вызывающем клиентском приложении не может быть найдена в базе данных"}); } // проточного REQUEST_ID чтобы OpenIddict восстановить // первоначальный запрос авторизации из кэша. вернуться View (новый AuthorizeViewModel {ApplicationName = application.DisplayName, RequestID = request.RequestId, Scope = request.Scope}); } [Авторизоваться, HttpPost ( "~ / подключения / разрешить / принять"), ValidateAntiForgeryToken] общественность асинхронного Task Accept (запрос OpenIdConnectRequest) {// Получение профиля зарегистрированного пользователя. VAR = пользователь ожидает _userManager.GetUserAsync (Пользователь); если (пользователь == NULL) {вернуться View ( "Error", новый ErrorViewModel {Ошибка = OpenIdConnectConstants.Errors.ServerError, ErrorDescription = "Внутренняя ошибка"}); } // Создать новый билет проверки подлинности. вар билет = ждет CreateTicketAsync (запрос, пользователь); // Возвращение SignInResult попросит OpenIddict выдать соответствующие маркеры доступа / идентичности. возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } [Авторизовать, HttpPost ( "~ / подключить / авторизацию / запретить"), ValidateAntiForgeryToken] общественного IActionResult Запретить () {// Уведомить OpenIddict, что субсидия разрешение было отказано владельцем ресурса // перенаправление агента пользователя в клиентское приложение с использованием соответствующего response_mode. вернуть FORBID (OpenIdConnectServerDefaults.AuthenticationScheme); } // Обратите внимание: действие выхода полезно только при реализации интерактивного // льется потоком кода авторизации или неявного потоком. [HttpGet ( «~ / подключения / выход из системы»)] общественный IActionResult Выход (запрос OpenIdConnectRequest) {// проточного REQUEST_ID, чтобы позволить OpenIddict восстановить // первоначальный запрос выхода из системы с распределенной кэш-памяти. вернуться View (новый LogoutViewModel {RequestID = request.RequestId}); } [HttpPost (» )] Общественный асинхронной Обмен Task (запрос OpenIdConnectRequest) {если (request.IsPasswordGrantType ()) {пользователь вар = ждет _userManager.FindByNameAsync (request.Username); если (пользователь == NULL) {вернуть BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = "Имя пользователя, / пароль пара является недействительным."}); } // Убедитесь, что пользователь имеет право войти в систему. Если (! Ждать _signInManager.CanSignInAsync (пользователь)) {вернуться BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = «Указанный пользователь не может войти в «}). } // Отклонить маркер запроса, если два фактора аутентификация была включена пользователем. если (_userManager.SupportsUserTwoFactor && ждут _userManager.GetTwoFactorEnabledAsync (пользователь)) {вернуться BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = "Указанный пользователь не может войти в систему."}); } // Убедитесь, что пользователь уже не заблокирован. если (_userManager.SupportsUserLockout && ждут _userManager.IsLockedOutAsync (пользователь)) {вернуться BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = " пользователь); возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } Вернуть BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.UnsupportedGrantType, ErrorDescription = "Указанный тип гранта не поддерживается."}); } Частный асинхронной Task CreateTicketAsync (запрос OpenIdConnectRequest, пользователь ApplicationUser) {// Создать новый ClaimsPrincipal, содержащий требование, которые // будут использованы для создания id_token, маркера или кода. Основной вар = ждет _signInManager.CreateUserPrincipalAsync (пользователь); // Примечание: по умолчанию, претензии не включается автоматически в доступе и идентификационных маркерах. // Чтобы разрешить OpenIddict сериализовать их, вы должны прикрепить их назначения, что указывает // должны ли они быть включены в маркеры доступа, в жетонах идентичности или в обоих. Еогеасп (вар претензии в principal.Claims) {// В этом примере каждое требование сериализовать в обоих доступа и маркеров идентичности. // В реальном приложении, вы, вероятно, хотите, чтобы исключить конфиденциальные требования // или применить политику претензий на основе областей, запрошенных клиентским приложением. claim.SetDestinations (OpenIdConnectConstants.Destinations.AccessToken, OpenIdConnectConstants.Destinations.IdentityToken); } // Создать новый билет аутентификации, удерживающий идентификатор пользователя. вар билет = новый AuthenticationTicket (принципал, новые AuthenticationProperties (), OpenIdConnectServerDefaults. AuthenticationScheme); // Установить список областей, предоставленных клиентское приложение. // Примечание: объем offline_access должен быть предоставлен // разрешить OpenIddict вернуть маркер обновления. ticket.SetScopes (новый [] {OpenIdConnectConstants.Scopes.OpenId, OpenIdConnectConstants.Scopes.Email, OpenIdConnectConstants.Scopes.Profile, OpenIdConnectConstants.Scopes.OfflineAccess, OpenIddictConstants.Scopes.Roles} .Intersect (request.GetScopes ())); обратный билет; }} Изменен: [Авторизоваться, HttpPost ( "~ / подключения / авторизовать"), ValidateAntiForgeryToken] общественность асинхронного Task Accept (запрос OpenIdConnectRequest) {// Получение профиля зарегистрированного пользователя. VAR = пользователь ожидает _userManager.GetUserAsync (Пользователь); если (пользователь == NULL) {вернуться View ( "Error", новый ErrorViewModel {Ошибка = OpenIdConnectConstants.Errors.ServerError, ErrorDescription = "Внутренняя ошибка"}); } // Создать новый билет проверки подлинности. вар билет = ждет CreateTicketAsync (запрос, пользователь); // Возвращение SignInResult попросит OpenIddict выдать соответствующие маркеры доступа / идентичности. возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } }); } // Создать новый билет проверки подлинности. вар билет = ждет CreateTicketAsync (запрос, пользователь); // Возвращение SignInResult попросит OpenIddict выдать соответствующие маркеры доступа / идентичности. возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } }); } // Создать новый билет проверки подлинности. вар билет = ждет CreateTicketAsync (запрос, пользователь); // Возвращение SignInResult попросит OpenIddict выдать соответствующие маркеры доступа / идентичности. возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); }
Zafrul Hassan
1

голосов
1

ответ
980

Просмотры

OpenIddict с Angular2-JWT

Я строю авторизации / аутентификации Angular2 приложение с ASP.NET Core. Когда я назвал метод с авторизовать атрибут я получаю сообщение об ошибке в окне Видеовыхода Студии: Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: Запрос начиная HTTP / 1.1 GET HTTP: // локальный: 50373 / API / задачи / GetLatest / текст / равнину Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware: информация: Не удалось проверить маркер eyJhbGciOiJSUzI1NiIsImtpZCI6IlJHRUVHM0FCSUJNVllHTEdQSjFSNjNRRkdHQlVKRUlHLU9ITy1QREgiLCJ0eXAiOiJKV1QifQ. eyJ1bmlxdWVfbmFtZSI6Im1hdGphei5jb2ZAb3BhbC5zaSIsIkFzcE5ldC5JZGVudGl0eS5TZWN1cml0eVN0YW1wIjoiMWVhYWE4MzktNzZlNy00NmVhLWE2NGUtYWJmNDVhNzY5YTBiIiwicm9sZSI6IkFkbWluaXN0cmF0b3JzIiwianRpIjoiM2U1NjAyMjUtMzQyNy00YmE4LTg4MzQtYzA2ZGI4NDE2NDA0IiwidXNhZ2UiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZSI6WyJvcGVuaWQiLCJvZmZsaW5lX2FjY2VzcyJdLCJzdWIiOiIxIiwibmJmIjoxNDg1NzgyOTAwLCJleHAiOjE0ODU3ODQ3MDAsImlhdCI6MTQ4NTc4MjkwMCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDM3My8ifQ.IqDnWJJKRtAh0BWKcdQgg_Gm_rnarffdnq5ksqpm0m6BnslI0EZ-7CugSG0223k6_FwuU7iSCiI2Cu7O2uaUedDEOdoIwyxpaEyr6yjzT5pxw7hbMnNxmxAydEajqE3OI-C55vzK0nhv9ToS93dz_QF8MIQ5EMIJ1cGXXO9wqQQ0xLvX7o2wIlM3rYvh_OORdALBxl5byMsrtc3ZrVj-BEiYuuwrUwSU5oPlH28o_Oo030s9NGqaQNea5T3PNQAL8-qC6aIdcDLBwOYZevTGGLMxde9czk_Duc0mkp5KtsyVZ-oV3qTh-EdZxpPjttu5_5Bh-8YCDLP5AzOsyX5sbg. Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10208: Не удается проверить аудиторию. validationParameters.ValidAudience является нулевым или пробел и validationParameters.ValidAudiences равно нулю. в Microsoft.IdentityModel.Tokens.Validators.ValidateAudience (IEnumerable`1 аудитории, SecurityToken SecurityToken, TokenValidationParameters validationParameters) в System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload (JwtSecurityToken JWT, TokenValidationParameters validationParameters) в System.IdentityModel.Tokens.Jwt. JwtSecurityTokenHandler.ValidateToken (String маркер, TokenValidationParameters validationParameters, SecurityToken & validatedToken) в Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.d__1.MoveNext () Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware: информация: Знаменосец не был идентифицирован. Неудача сообщение: IDX10208: Не удалось проверить аудиторию. validationParameters.ValidAudience является нулевым или пробел и validationParameters.ValidAudiences равно нулю. Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: Ошибка авторизации для пользователя: (нуль). До этого я войти в себя и получить следующий объект в Angular2 приложении: access_token: "eyJhbGciOiJSUzI1NiIsImtpZCI6IlJHRUVHM0FCSUJNVllHTEdQSjFSNjNRRkdHQlVKRUlHLU9ITy1QREgiLCJ0eXAiOiJKV1QifQ. AddSignInManager () .AddDefaultTokenProviders (); services.AddOpenIddict () .AddEntityFrameworkCoreStores () .AddMvcBinders () .EnableTokenEndpoint ( "/ API / авторизации / маркер") .AllowPasswordFlow () .AllowRefreshTokenFlow () .UseJsonWebTokens () .AddEphemeralSigningKey () // TODO Най би миллиарду прави certifikát, Ce odstranič к vrstico п Dela по ошибке ВИДИСА. .DisableHttpsRequirement (); services.AddSingleton (); } Задвижка (Исключение ех) {Console.WriteLine (ex.ToString ()); бросить; }} Общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment ENV, ILoggerFactory loggerFactory, DbSeeder dbSeeder) {loggerFactory.AddConsole (Configuration.GetSection ( "Вход")); loggerFactory.AddDebug (); если (env.IsDevelopment ()) {app.UseDeveloperExceptionPage (); app.UseWebpackDevMiddleware (новые WebpackDevMiddlewareOptions {HotModuleReplacement = истина}); } Еще {} app.UseStaticFiles (); app.UseIdentity (); app.UseOpenIddict (); //app.UseOAuthValidation (); // это работает app.UseJwtBearerAuthentication (новые JwtBearerOptions () {Authority = "HTTP: // локальный: 50373 /", AutomaticAuthenticate = верно, AutomaticChallenge = истина, RequireHttpsMetadata = ложь}); app.UseMvc (); попробуйте {dbSeeder.SeedAsync (); } Задвижка (AggregateException е) {певд Exception (e.ToString ()); }}} Разработчик консоль заголовки в закладке Сети: локальный: 50373 Pragma: нет кэша Referer: HTTP: // локальный: 50373 / задачи User-Agent: Mozilla / 5.0 (Windows NT 10,0; Win64; x64) AppleWebKit / 537,36 (KHTML, как Gecko) Chrome / 55.0.2883.87 Safari /537.36 Что я пропустил? Обновлено: Как я уже сказал в комментариях не забудьте сохранить access_token в id_token локального хранилища: частный логин (имя пользователя: строка, пароль: строка) {пусть заголовки = новые заголовки ({ «Content-Type»: «применение / х-WWW-форма -urlencoded»}); пусть варианты = новые RequestOptions ({заголовки: заголовки}); Const данных = {имя пользователя: имя пользователя, пароль: пароль}; Object.assign (данные, {grant_type: "пароль", // offline_access требуется для маркеров рамки обновления: [ 'OpenId offline_access']}); вернуться this.http.post (» апи / разрешение / маркер», this.encodeObjectToParams (данные), опционы) .map (Рез => res.json ()) .map ((лексемы: AuthTokenModel) => {localStorage.setItem ( 'id_token', tokens.access_token ); // !!! возвращать лексемы;}); } Потому что Angular2-JWT использование id_token для маркеров доступа по умолчанию.
Makla
1

голосов
1

ответ
54

Просмотры

Получение времени, что маркер доступа был создан?

Я пытаюсь получить требование, содержащее лексему дату создания ... Я пробовал следующее: вар createdDate = contextAccessor.HttpContext.User.FindFirstValue ( «IssuedUtc»); вар createdDate = contextAccessor.HttpContext.User.FindFirstValue ( "ISS"); вар createdDate = contextAccessor.HttpContext.User.FindFirstValue (ClaimTypes.AuthenticationInstant);
levitatejay
1

голосов
1

ответ
606

Просмотры

косяк использовать openiddict с Microsoft.AspNetCore.Authentication.JwtBearer

У меня есть openiddict пример работает, но я хочу использовать JWT вместо этого. Я узнал, что я не могу использовать OAuth с JWT, как это две разные вещи. Имеет смысл. Но если я хочу использовать JWT, то мне нужно установить маркер пакета промежуточного носителя. Что я думаю, для .net ядра, является Microsoft.AspNetCore.Authentication.JwtBearer Но я не могу установить этот пакет с openiddict в то же время. Есть ли конкретная версия JwtBearer мне нужно использовать, чтобы заставить его работать? Я получаю ошибку, когда я пытаюсь установить это удается решить проблему «OpenIddict (> = 1.0.0)» для».NETCoreApp, Version = v1.1' . Не удается решить проблему 'OpenIddict.Mvc (> = 1.0.0)' для».NETCoreApp, Version = v1.1' . Не удается решить проблему 'OpenIddict.EntityFrameworkCore (> = 1.0.0)' для».NETCoreApp, Version = v1.1' .
cphilpot
1

голосов
1

ответ
406

Просмотры

Как реализовать Facebook родное приложение входа в ионическом 3 с .net Core API

У меня есть API .Net Ядро Auth с OpenIddict и сердцевины Api .Net «клиентом». Теперь я строить Ионные 3 родное приложение, и я хочу, чтобы реализовать Facebook логин, где люди могут войти, через родное приложение Facebook. До сих пор я нашел только примеры, в которых используется веб Войти Facebook. До сих пор у меня есть: рабочий .Net Ядро Auth API, который возвращает JWT лексемы рабочую .Net Client API Core, который принимает эти JWT маркеры рабочий Ионные 3 приложение, которое может войти в систему с именем пользователя + пароль, получить маркер и использовать его. рабочий Ионные 3 приложение с логином Facebook, вошедшего в через родное приложение Facebook (через Cordova плагин) Он чувствует, как поток кода является правильным способом пойти, но все примеры перенаправляет на веб-странице входа в Facebook, так что пользователь, вероятно, до сих пор имеет войти в систему на Facebook в то время как его родное приложение Facebook уже вошел в Мой вопрос.: после того, как пользователь вошел в систему с помощью Facebook в мое приложение Ionic, как я могу получить JWT Токен из Апи OpenIddict Auth, так что я могу использовать свой клиентский API? Или я должен изменить поток как-то в то время как родное приложение Facebook используется войти в систему? обновление: В ионическом я получаю Facebook UserId, которая равна AspNetUserLogins.ProviderKey. Это достаточно безопасно, чтобы войти в свой Апи?
kloarubeek
1

голосов
1

ответ
153

Просмотры

Регистрация OpenIddict объектов в DbContext по-другому

Есть еще один способ, чтобы зарегистрировать наборы сущностей, необходимых OpenIddict на DbContext кроме вызова options.UseOpenIddict (); в services.AddDbContext (опции => {...}). У меня есть проблемы с этим подходом, потому что у меня больше DbContexts, и я хочу поделиться DbContextOptions. В .Net Core 2, если вы можете использовать не общие для всех DbContextOptions DbContexts ИЛИ вы должны необщое DbContextOptions для всех DbContexts. Таким образом, я хотел бы первый подход, если это возможно.
Igor
1

голосов
1

ответ
853

Просмотры

Настройка пользовательских рамки для OpenIddict MVC Ядра 2.0

Я довольно новыми для OpenId и авторизации в MVC и создание OpenIddict аутентификации сервера и клиента MVC приложение, как показано в образце кода авторизации потока. https://github.com/openiddict/openiddict-samples мне нужно добавить CompanyID от моего пользователя приложения моих претензий и пытаюсь выяснить шаги, необходимые. До сих пор я узнал следующее: добавить претензии и объем билет в AuthorizationController.CreateTicketAsync путем создания новых claimspricipal с новыми добавленными претензиями и добавлением Scop звонить в ticket.SetScopes. // Добавляем свои специфические требования: CompanyID и CompanyName Var претензии = новый список (); claims.Add (новое требование (MyClaimsConstants.Claims.CompanyId, user.SelectedCompanyId.ToString ())); T_Company компания = ждут _companyRepo.GetCompany (user.SelectedCompanyId); claims.Add (новое требование (MyClaimsConstants. Claims.CompanyName, company.CompanyName)); // Создать новую идентичность с добавленной претензии вар newIdentity = новый ClaimsIdentity (principal.Identity, претензий); Основной = новый ClaimsPrincipal (newIdentity); .... если (! Request.IsAuthorizationCodeGrantType ()) {// Установить список областей, предоставленных клиентское приложение. // Примечание: объем offline_access должен быть предоставлен // разрешить OpenIddict вернуть маркер обновления. ticket.SetScopes (новые [] {OpenIdConnectConstants.Scopes.OpenId, OpenIdConnectConstants.Scopes.Email, OpenIdConnectConstants.Scopes.Profile, OpenIdConnectConstants.Scopes.OfflineAccess, OpenIddictConstants.Scopes.Roles, MyClaimsConstants.
Henrik Poulsen
1

голосов
1

ответ
156

Просмотры

Могу ли я доверять ClaimsPrincipal от Авторизованного маршрута

Я использую OpenIdDict и САШ, в ядро ​​2.0 Идентичность. Я его настроен (на данный момент), чтобы использовать поток Пароль (владелец ресурса Пароль Полномочия Grant). Клиент является Угловой SPA, что я сделал. У меня есть контроль над клиентом и сервером. Я в настоящее время кодирования пользовательских AuthorizationHandler и он хорошо работает до сих пор. Тем не менее, я немного обеспокоен моим ClaimsPrincipal. Мои методы, обеспеченные WebAPI украшены атрибутами Авторизоваться [Авторизоваться (AuthenticationSchemes = AuthValidationDefaults.AuthenticationScheme)] В моем понимании, если добавить политики в мой санкционировать контекст я получаю то же самое, как один из моих контроллера. Он имеет свойство «User», который я могу назвать «HasClaims» с. Я добавил несколько претензий типа «разрешения» на мой Принципал, и они действительно появляются. Построен этот ClaimPrincipals просто путем декодирования канала передачи данных маркер передается от SPA? Если да, то, как представляется небезопасным доверять этот список претензий, чтобы сделать что-либо сторону сервера ... но, маркер носителем является access_token и не id_token и не может просто быть расшифрован на https://jwt.io/ I можно использовать UserManager / RoleManager, чтобы получить все мои претензии, на стороне сервера, для зарегистрированного пользователя, а затем использовать этот список Валиде против. Тем не менее, я беспокоюсь о возможных проблемах с производительностью делать так ... Так что, я хотел бы знать, если ClaimPrincipals я (как собственность пользователя) мой контроллер является доверительным, или если я должен получить мои претензии себя. т просто быть расшифрован на https://jwt.io/ я мог бы использовать UserManager / RoleManager, чтобы получить все мои претензии, сторона сервера, для зарегистрированного пользователя, а затем использовать этот список Валиды против. Тем не менее, я беспокоюсь о возможных проблемах с производительностью делать так ... Так что, я хотел бы знать, если ClaimPrincipals я (как собственность пользователя) мой контроллер является доверительным, или если я должен получить мои претензии себя. т просто быть расшифрован на https://jwt.io/ я мог бы использовать UserManager / RoleManager, чтобы получить все мои претензии, сторона сервера, для зарегистрированного пользователя, а затем использовать этот список Валиды против. Тем не менее, я беспокоюсь о возможных проблемах с производительностью делать так ... Так что, я хотел бы знать, если ClaimPrincipals я (как собственность пользователя) мой контроллер является доверительным, или если я должен получить мои претензии себя.
Carl Quirion
1

голосов
1

ответ
95

Просмотры

Есть ли OpenIddict 2.0.0 RC3 финального стола поддержки AspNetUsers?

Я следовал за видео-учебник по указанным ниже веб-ссылке, и я получаю следующее сообщение об ошибке при навигации к https: // локальный: 5001 / подключение / маркера: сбой: Microsoft.AspNetCore.Server.Kestrel [13] ID соединения «0HLFGA04R3IV9», идентификатор запроса «0HLFGA04R3IV9: 00000001»: необработанное исключение было брошено приложением. System.Data.SqlClient.SqlException (0x80131904): Неверное имя объекта 'OpenIddictApplications'. Из того, что я могу сказать, новый OpenIdDict не поддерживает таблицу AspNetUsers, которая создается с помощью миграции. Это правильно? В этом уроке автор использует таблицу AspNetUsers. Примечание: автор использует OpenIddict 1,0. и я использую 2.0 RC3. Я не могу получить мой образец ToDoList проект для использования таблицы AspNetusers. Можно ли получить OpenIddict 2. 0 использовать таблицу AspNetUsers? Если да, то каким образом? https://www.youtube.com/watch?v=GIQqIz1Gpvo&index=4&list=PLu4Bq53iqJJAo1RF0TY4Q5qCG7n9AqSZf Startup.cs с использованием системы; используя System.Collections.Generic; используя System.Linq; используя System.Threading.Tasks; используя Microsoft.AspNetCore.Builder; используя Microsoft.AspNetCore.Hosting; используя Microsoft.Extensions.Configuration; используя Microsoft.Extensions.DependencyInjection; используя Microsoft.Extensions.Logging; используя Microsoft.EntityFrameworkCore; используя TodoListAPI.Data; используя JsonApiDotNetCore.Extensions; используя Microsoft.AspNetCore.Cors; используя Microsoft.AspNetCore.Identity.EntityFrameworkCore; используя Microsoft.AspNetCore.Identity; используя OpenIddict.Abstractions; используя OpenIddict.Core; используя OpenIddict.EntityFrameworkCore.Models; используя OpenIddict.Validation; используя TodoListAPI.Models; используя AspNet.Security. OpenIdConnect.Primitives; используя Microsoft.IdentityModel.Tokens; //// Некоторый код здесь общественный недействительный ConfigureServices (услуги IServiceCollection) {// Добавить рамочные услуги. services.AddMvc (); services.AddCors (опции => {options.AddPolicy ( "AllowSpecificOrigins", строитель => {builder.WithOrigins ( "HTTP: // локальный: 4200");}); //options.AddPolicy("AllowAllOrigins», // строитель => // {// builder.AllowAnyOrigin (); //});}); services.AddDbContext (опт => {opt.UseSqlServer (this.GetConnectionString ()); opt.UseOpenIddict ();}); services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders (); Сервисы. AddOpenIddict () .AddCore (OPT => {opt.UseEntityFrameworkCore () .UseDbContext ();}) .AddServer (опции => {options.UseMvc (); options.EnableTokenEndpoint ( "/ подключения / маркер"); options.AllowPasswordFlow (); options.AllowRefreshTokenFlow (); options.DisableHttpsRequirement (); options.AcceptAnonymousClients (); // options.AllowAuthorizationCodeFlow ();}) .AddValidation (); services.AddAuthentication (опции => {options.DefaultScheme = OpenIddictValidationDefaults.AuthenticationScheme;}); services.Configure (опции => {options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name; options.ClaimsIdentity. UserIdClaimType = OpenIdConnectConstants.Claims.Subject; options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role; }); services.AddJsonApi (опт => opt.Namespace = "API / v1"); } // Этот метод вызывается средой выполнения. Этот метод используется для настройки трубопровода запроса HTTP. общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment окр, ILoggerFactory loggerFactory) {loggerFactory.AddConsole (Configuration.GetSection ( "Вход")); loggerFactory.AddDebug (); // Показывает UseCors с CorsPolicyBuilder. //app.UseCors(builder => builder.WithOrigins ( "HTTP: // локальный: 4200")); app.UseCors ( "AllowSpecificOrigins"); //app.UseIdentity (); //app.UseOpenIddict (); //app.useoauth app.UseAuthentication (); app.UseMvcWithDefaultRoute (); app.UseJsonApi (); }
J Weezy
1

голосов
1

ответ
0

Просмотры

Как получить токен обновления в первый раз?

Когда я прошу маркер доступа в самый первый раз, я не должен получить токен обновления, а? Я следую за .net основной версии логики потока обновления (Startup.cs, AuthorizationController.cs) и тестирование с почтальоном, чтобы получить маркер доступа и обновления маркера. Я могу получить маркер доступа, но кажется, что он не возвращает токен обновления. Что я здесь отсутствует?
bbusdriver
1

голосов
1

ответ
0

Просмотры

Как настроить схему по умолчанию для Openiddict-основных таблиц в EF Ядра

Как я могу установить схему по умолчанию для Openiddict-основных таблиц? К сожалению EF Основного does't есть (не то, что я знаю) метод, который будет принимать только схему и (EntityTypeBuilder.ToTable) требует также таблиц имени, кроме схемы.
Makla
1

голосов
1

ответ
890

Просмотры

Как вы можете реализовать токенов обновления в веб-приложение - angularjs

Я использую безопасности на основе токенов в моем веб-приложение. Стороне сервера пишет с помощью C # и я использую openiddict для входа в систему и выдачи жетонов, здесь. Я currencyly с помощью потока неявного. По умолчанию мои маркеры имеют срок службы 1 часа, после чего вы должны протоколирования снова. Я заперт вниз мой API, чтобы принять предъявителя лексемы только и не печенье. Я хотел бы реализовать токенов обновления, но после прочтения многих веб-сайтов, кажется, что реализация токенов обновления на веб-приложение, не является хорошим способом пойти из-за хакеров получать токен обновления. Я знаю, что для использования токенов обновления, вы должны использовать поток кода, вместо того, чтобы неявный, что я могу сделать. Как люди обойти эту ситуацию в своих веб-приложений? Я не могу быть только тот, кто хочет маркер длиться дольше, чем через час в веб-приложение?
Gillardo
1

голосов
1

ответ
1k

Просмотры

Настройка DbContext для OpenIddict

Я использую OpenIddict для маркеров аутентификации JWT в моем .NET ядра приложения. Я следовал этому учебнику, но теперь я получаю следующее сообщение об ошибке: InvalidOperationException: Нет поставщик баз данных не был сконфигурирован для этого DbContext. Провайдер может быть сконфигурирован с помощью переопределения метода DbContext.OnConfiguring или с помощью AddDbContext от поставщика услуг приложения ... Мой метод ConfigureServices в Startup.cs: общественный недействительный ConfigureServices (услуги IServiceCollection) {вар строитель = новый ConfigurationBuilder () .AddJsonFile ( "appsettings.json"); Конфигурация = builder.Build (); services.AddEntityFrameworkSqlServer () .AddDbContext (опции => options.UseSqlServer (Конфигурация [ "данные: MyDbContext: ConnectionString"])); Сервисы. AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders () .AddOpenIddictCore (конфигурации => config.UseEntityFramework ()); services.AddMvc (); // для высева базы данных с детальным дем пользователем //services.AddTransient (); services.AddScoped (); } Не уверен, что делать это, как я не могу добавить DbContext при использовании AddIdentity. Моя строка соединения в порядке, все работает, прежде чем добавить OpenIddict. UPDATE Вот мой файл appsettings.json: { "Logging": { "IncludeScopes": ложь, "LOGLEVEL": { "По умолчанию": "Verbose", "Система": "Информация", "Microsoft": "Информация"} }, "Data": { "DefaultConnection": { "ConnectionString": "моя строка соединения"}, "SaleboatContext": { "ConnectionString": "моя строка соединения"}}} Мой DbContext: класс ApplicationUser общественности: IdentityUser {} общественного частичного класса MyDbContext: IdentityDbContext {защищен переопределения недействительным OnModelCreating (ModelBuilder MODELBUILDER) {base.OnModelCreating (MODELBUILDER); } OnModelCreating (MODELBUILDER); } OnModelCreating (MODELBUILDER); }
barnacle.m
1

голосов
1

ответ
72

Просмотры

Параметры POST усечены

Имея странный вопрос с моей просьбой от углового 2 приложения к основной asp.net серверу 1.0 Web API. Сервер использует OpenIddict. Вот запрос: В апи конечной точке / подключить запрос / маркер вар = HttpContext.GetOpenIdConnectRequest (); Переменная запроса имеет несколько параметров, один из которых параметр ресурса, который содержит URI. URI, в настоящее время усеченным. Результатом является то, что библиотека OpenIddict не в состоянии правильно подобрать ресурс, поэтому не в состоянии проверить подлинность, так как при условии, URI не соответствует URI ресурса.
MichaelTran
1

голосов
2

ответ
993

Просмотры

SignalR и OpenId Connect

У меня есть сервер, который использует ASP.NET Core, Web Api и OpenIddict в рамках авторизации. Теперь я добавил хост SignalR и хочу добавить разрешение на него. Из разных источников я обнаружил, что SignalR (JS клиент) хочет, чтобы вы посылаете маркер доступа в строке запроса или печенье, как WebSockets не поддерживают заголовки. Как промежуточная аутентификация не проверяет строку запроса или печенье контейнер для записи авторизации мне нужно реализовать такой провайдер / ретривера / распознаватель, который считывает это значение самостоятельно. Я нашел решение для IdentityServer, но ничего о OpenIddict. Где / Как реализовать такой маркер распознаватель с OpenIddict?
NtFreX
1

голосов
1

ответ
239

Просмотры

OpenIDDict Зарегистрированный пользователь подтверждения по электронной почте

Я использую ASP.NET MVC Сердечник с OpenIDDict. Я с использованием представления с аутентификацией печенья и JWT для OpenIDDict. Все работает отлично за исключением следующего scenerio: Идентичность изменен, чтобы отправить электронное письмо с подтверждением пользователю первым, чтобы подтвердить свой адрес электронной почты. Пользователь получает ссылку по электронной почте и нажмет на него. Затем они войти в систему. Просто. В то же время они не могут получить доступ к любым страницам. Но я заметил, используя почтальон, они могут получить доступ к решению через API, через OpenIDDict. Они по-прежнему авторизироваться. И как они авторизироваться они могут получить доступ к API. Только что написал это я имел мозг отказаться, и я мог бы просто ввести код в AuthenticationController во время обмена действия: общественное асинхронном Обмен Task (запрос OpenIdConnectRequest) {Debug.Assert (request.IsTokenRequest (), " OpenIddict связующее для ASP.NET MVC ядра не зарегистрирован. "+ "Убедитесь, что services.AddOpenIddict () AddMvcBinders () правильно называется");.. Если (request.IsPasswordGrantType ()) {вар пользователя = ждут _userManager.FindByNameAsync (request.Username); // если (пользователь == нуль), если (пользователь == NULL ||! (ОЖИДАНИЕ _userManager.IsEmailConfirmedAsync (пользователь))) {Works! Там U Go ... ответил на мой собственный вопрос. Mya помочь другим в будущем // если (пользователь == NULL), если (пользователь == NULL ||! (Ждем _userManager.IsEmailConfirmedAsync (пользователь))) {Works! Там U Go ... ответил на мой собственный вопрос. Mya помочь другим в будущем // если (пользователь == NULL), если (пользователь == NULL ||! (Ждем _userManager.IsEmailConfirmedAsync (пользователь))) {Works! Там U Go ... ответил на мой собственный вопрос. Mya помочь другим в будущем
Bhail
1

голосов
1

ответ
1.3k

Просмотры

Не удалось разрешить услугу типа OpenIddict.Core.OpenIddictApplicationManager [OpenIddict.Models.OpenIddictApplication] при попытке активировать

Я пытаюсь построить логин на основе RefreshFlow образца. У меня есть приложение Angular2. Когда я пытаюсь войти, я получаю следующее сообщение об ошибке: Произошло необработанное исключение при обработке запроса. InvalidOperationException: Не удается разрешить услугу типа "OpenIddict.Core.OpenIddictApplicationManager`1 [OpenIddict.Models.OpenIddictApplication] при попытке активировать«OpPISWeb.Controllers.AuthorizationController». Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider зр, тип Type, Type requiredBy, BOOL isDefaultParameterRequired) Я использую Javascript шаблон услуг. Мой запрос в прикрепленном файле на Github. Моя конфигурация: общественный недействительный ConfigureServices (услуги IServiceCollection) {попробуйте {services.AddMvc (); services.AddEntityFrameworkSqlServer (); Сервисы. AddScoped (); services.AddScoped (); services.AddScoped (); services.AddScoped (); services.AddScoped (); Соединение вар = Конфигурация [ "ConnectionStrings"]; services.AddDbContext (опции => {options.UseSqlServer (соединение); options.UseOpenIddict ();}); услуги .AddIdentity () .AddUserStore () .AddUserManager () .AddRoleStore () .AddRoleManager () .AddSignInManager () .AddDefaultTokenProviders (); services.AddOpenIddict () .AddEntityFrameworkCoreStores () .AddMvcBinders () .EnableTokenEndpoint ( "/ API / авторизации / маркер") .AllowPasswordFlow () .AllowRefreshTokenFlow (). DisableHttpsRequirement (); services.AddSingleton (); } Задвижка (Исключение ех) {Console.WriteLine (ex.ToString ()); бросить; }} Общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment ENV, ILoggerFactory loggerFactory, DbSeeder dbSeeder) {loggerFactory.AddConsole (Configuration.GetSection ( "Вход")); loggerFactory.AddDebug (); если (env.IsDevelopment ()) {app.UseDeveloperExceptionPage (); app.UseWebpackDevMiddleware (новые WebpackDevMiddlewareOptions {HotModuleReplacement = истина}); } Еще {} app.UseStaticFiles (); app.UseIdentity (); app.UseOpenIddict (); app.UseOAuthValidation (); app.UseMvc (); попробуйте {dbSeeder.SeedAsync (); } Задвижка (AggregateException е) {певд Exception (e.ToString ()); }} У меня есть пользовательские классы Идентичность и магазины: [Таблица ( "Роли")] общественный частичный класс AppRole: IdentityRole {общественного AppRole () {} общественного AppRole (строка роли): базовая (роль) {}} [Таблица ( "Пользователи «)] общественный класс AppUser парциальном: IdentityUser {} частичного AppUserClaim общественного класса: IdentityUserClaim ... общественный частичный класс AppDbContext: IdentityDbContext общественного класса AppRoleManager: RoleManager {общественного AppRoleManager (IRoleStore магазин, IEnumerable roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber ошибка, ILogger регистратор, IHttpContextAccessor contextAccessor): основание (магазин, roleValidators, keyNormalizer, ошибки, регистратор, contextAccessor) {}} Класс AppRoleStore общественности: Rolestore {общественный контекст AppRoleStore (AppDbContext, IdentityErrorDescriber описатель = нуль): базовый (контекст, описатель) {} защищен переопределение AppRoleClaim CreateRoleClaim (AppRole роль, Претензия) {возвратить новый AppRoleClaim (роль, претензии ); }} Класс AppSignInManager общественности: SignInManager {общественного AppSignInManager (UserManager userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory claimsFactory, IOptions optionsAccessor, ILogger регистратор): основание (userManager, contextAccessor, claimsFactory, optionsAccessor, регистратор) {}} Класс AppUserManager общественности: UserManager {общественного AppUserManager (IUserStore магазин, IOptions optionsAccessor, IPasswordHasher passwordHasher, IEnumerable userValidators, IEnumerable passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber ошибки, услуги IServiceProvider, ILogger регистратор): базовая (магазин, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, ошибки, услуги, регистратор) {}} Класс AppUserStore общественности: UserStore {общественного AppUserStore (AppDbContext контекст, IdentityErrorDescriber описатель = NULL): основание (контекст, описатель) {} защищен переопределение AppUserClaim CreateUserClaim (пользователь AppUser, претензии требование) {возвращают новый AppUserClaim (пользователь, претензии); } Защищенного переопределение AppUserLogin CreateUserLogin (пользователь AppUser, UserLoginInfo Логин) {вернуть новый AppUserLogin (пользователь, логин); } Защищенного переопределения AppUserRole CreateUserRole (пользователь AppUser, AppRole роль) {возвратить новый AppUserRole (пользователь, роль); } Защищен переопределение AppUserToken CreateUserToken (пользователь AppUser, строка loginProvider, имя строки, строковое значение) {вернуть новый AppUserToken (пользователь, loginProvider, имя, значение); }} Контроллер: класс AuthorizationController общественности: Контроллер // ... [HttpPost ( "маркер"), Производит ( "приложения / JSON")] общественность асинхронной Обмен Task (запрос OpenIdConnectRequest) {Debug.Assert (request.IsTokenRequest (), "OpenIddict связующее для ASP.NET MVC ядра не зарегистрирован." + "Убедитесь, что services.AddOpenIddict () AddMvcBinders () правильно называется.."); // .... Я действительно надеюсь, что кто-то может мне точку в правильном направлении. Я в отчаянии. Спасибо.
Makla
1

голосов
1

ответ
426

Просмотры

Требование Https в Openiddict с помощью ARR

Я использую ARR без HTTPS разгрузки на наших нелокальных условиях хостинга. Это означает, что запросы, которые поражают ARR являются HTTPS, но запросы, отправленные на внутренних серверах только HTTP. Если я отключить HTTPS требования в openiddict затем конфигурация возвращает HTTP URL. Если включить его, то запросы отклоняются Ьс серверы Серверные получить их как HTTP. Есть ли способ обойти это?
pholly
1

голосов
1

ответ
1k

Просмотры

Получить токен Loging с использованием внешних провайдеров, использующих OpenIddict

У меня есть API с ASP.NET Ядра, который будет потребляться нативных мобильных приложений (в настоящее время UWP, Android), и я пытаюсь реализовать способ, которым клиенты могут зарегистрироваться и войти в систему как имя пользователя / пароль и внешних поставщиков, таких как Google и Facebook. Сейчас я использую openIddict и мой ExternalProviderCallback должен вернуть местные жетоны, которые я предполагаю, что в настоящее время возвращает печенье! (Я скопировал большинство кодов где-то), а также, кажется, что это не AuthorizationCodeFlow, который я предполагаю, что это правильный путь! Теперь вот мой класс запуска общественного класса Запуск {публичный запуск (IHostingEnvironment окр) {вар строитель = новый ConfigurationBuilder () .SetBasePath (env.ContentRootPath) .AddJsonFile ( "appsettings.json", по желанию: правда, reloadOnChange: правда) .AddJsonFile ($» Cookies.ApplicationCookie.Events = новые CookieAuthenticationEvents () {OnRedirectToLogin = контекст => {если (context.Request.Path.StartsWithSegments ( "/ API") && context.Response.StatusCode == 200) context.Response.StatusCode = 401; вернуться Task.CompletedTask; }, OnRedirectToAccessDenied = контекст => {если (context.Request.Path.StartsWithSegments ( "/ API") && context.Response.StatusCode == 200) context.Response.StatusCode = 403; вернуться Task.CompletedTask; }}; }) .AddEntityFrameworkStores (). AddDefaultTokenProviders (); services.AddDbContext (варианты => {options.UseSqlite (Конфигурация [ "Данные: DefaultConnection: ConnectionString"]); options.UseOpenIddict ();}); services.AddOpenIddict () .AddEntityFrameworkCoreStores () .UseJsonWebTokens () .AddMvcBinders () .EnableAuthorizationEndpoint (Конфигурация [ "Аутентификация: OpenIddict: AuthorizationEndPoint"]) .EnableTokenEndpoint (Конфигурация [ "Аутентификация: OpenIddict: TokenEndPoint"]) .AllowPasswordFlow (). AllowAuthorizationCodeFlow () .AllowImplicitFlow () .AllowRefreshTokenFlow () .DisableHttpsRequirement () .AddEphemeralSigningKey () .SetAccessTokenLifetime (TimeSpan. FromMinutes (2)) .SetRefreshTokenLifetime (TimeSpan.FromMinutes (10)); services.AddSingleton (); services.AddMvc (опции => {options.SslPort = 44380; options.Filters.Add (новый RequireHttpsAttribute ());}); } // Этот метод вызывается средой выполнения. Этот метод используется для настройки трубопровода запроса HTTP. общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment окр, ILoggerFactory loggerFactory, DbSeeder dbSeeder) {loggerFactory.AddConsole (Configuration.GetSection ( "Вход")); loggerFactory.AddDebug (); app.UseIdentity (); app.UseOAuthValidation (); app.UseGoogleAuthentication (новые GoogleOptions () {AutomaticAuthenticate = верно, AutomaticChallenge = истина, ClientId = Configuration [ "Аутентификация: Google: ClientId"], ClientSecret = Configuration [ "Аутентификация: Google: ClientSecret"], CallbackPath = "/ Google-входа в аккаунт", Scope = { "электронная почта"}}); app.UseFacebookAuthentication (новые FacebookOptions () {AutomaticAuthenticate = верно, AutomaticChallenge = верно, AppId = Конфигурация [ "Проверка подлинности: Facebook: AppId"], AppSecret = Конфигурация [ "Проверка подлинности: Facebook: AppSecret"], CallbackPath = «/ facebook-зарегистрировались »Scope = { "электронная почта"}}); app.UseOpenIddict (); app.UseMvcWithDefaultRoute (); попробуйте {dbSeeder.SeedAsync () Wait (). } Задвижка (AggregateException ех) {певд Exception (ex.ToString ()); }}} И вот AccountController Что делает внешних поставщиков Работа: [Маршрут ( "апи / [контроллер]")] общественный класс AccountsController: BaseController {частные чтения наследуют IConfiguration _configuration; #region Конструктор общественных AccountsController (ApplicationDbContext контекст, SignInManager signInManager, UserManager userManager, конфигурации наследуют IConfiguration): основание (контекст, signInManager, userManager) {_configuration = конфигурации; } #Endregion Конструктор #region Провайдеры внешней аутентификации // GET: / API / счета / ExternalLogin [HttpGet ( "ExternalLogin / {поставщик}")] общественность IActionResult ExternalLogin (строка поставщика, струны ReturnUrl = NULL) {переключатель (provider.ToLower ()) {случай "facebook": случай "Google": случай "твиттер": // Запрос переадресации внешнего поставщика входа в системе. вар redirectUrl = Url.Action ( "ExternalLoginCallback", "Счета", новый {ReturnUrl = ReturnUrl}); вар свойства = SignInManager.ConfigureExternalAuthenticationProperties (Провайдер, redirectUrl); возвращающий Challenge (свойства, поставщик); по умолчанию: возвращение BadRequest (новый {Ошибка = $ "Provider '{поставщик}' не поддерживается."}); }} [HttpGet ( "ExternalLoginCallBack" )] Общественного асинхронной Task ExternalLoginCallback (строка ReturnUrl = NULL, строка remoteError = NULL) {попробуйте {если (remoteError = NULL) {певд Exception (remoteError!); } = вар информация ждут SignInManager.GetExternalLoginInfoAsync (); если (информация == NULL) {певд исключение:; ( "ERROR Нет информации для входа в наличии.") } Пользователя переменного = ждут UserManager.FindByLoginAsync (info.LoginProvider, info.ProviderKey); если (пользователь == NULL) {вар emailKey = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"; вар электронная почта = info.Principal.FindFirst (emailKey) .Value; пользовательские = ждут UserManager. FindByEmailAsync (электронная почта); если (пользователь == NULL) {вар Теперь = DateTime.Now; вар IdKey = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"; вар имя пользователя = String.Format ( "{0} {1}", info.LoginProvider, info.Principal.FindFirst (IdKey) .Value); Пользователь = новый ApplicationUser {UserName = имя пользователя, электронная почта = электронная почта, CreatedDate = теперь LastModifiedDate = Теперь}; ждут UserManager.CreateAsync (пользователь, "SomePass4ExProvider123 + -"); ОЖИДАНИЕ UserManager.AddToRoleAsync (пользователь, "Дата регистрации"); user.EmailConfirmed = TRUE; user.LockoutEnabled = ложь; } Ждут UserManager.AddLoginAsync (пользователь, данные); ждут DbContext.SaveChangesAsync (); } // создать объект JSON аутентификации уаг AUTH = новый {тип = "Внешний", ProviderName = info.LoginProvider}; // вывести тег для вызова функции JS зарегистрированной в родительском окне глобального возвращение сферы содержания ( "" + "window.opener.externalProviderLogin (" + JsonConvert.SerializeObject (AUTH) + ");" + «window.close () ;»+ "", "текст / html"); } Задвижка (Исключение ех) {вернуть BadRequest (новый {Ошибка = ex.Message}); .}} [HttpPost ( "Выход")] общественность IActionResult Выход () {если (HttpContext.User.Identity.IsAuthenticated) {SignInManager.SignOutAsync () Подождите (); } Возврата OK (); } Поставщики #endregion Внешняя аутентификация} и, наконец ConnectController который сгенерирует лексем: [Маршрут ( "апи / [контроллер]")] класс ConnectController общественности: контроллер {частный UserManager _userManager только для чтения; частное чтение SignInManager _signInManager; частные чтения наследуют IConfiguration _configuration; общественного ConnectController (UserManager userManager, SignInManager signInManager, Конфигурация наследуют IConfiguration) {_userManager = userManager; _signInManager = signInManager; _configuration = конфигурация; } [HttpPost ( "маркера"), производит ( "приложения / JSON")] общественность асинхронной Task Токеном (запрос OpenIdConnectRequest) {если (request.IsPasswordGrantType ()) {пользователь вар = ждут _userManager.FindByNameAsync (request.Username); #region Аутентифицировать пользователя, если (пользователь == NULL) {// Возвращаем плохой запрос, если пользователь не существует обратный BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = «Недопустимое имя пользователя или пароль»}); } Если (! Ждать _signInManager.CanSignInAsync (пользователь) || (_userManager.SupportsUserLockout && ждут _userManager.IsLockedOutAsync (пользователь))) {вернуться BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = «Указанный пользователь не может войти в в." }); } Если (! Ждать _userManager.CheckPasswordAsync (пользователь, request.Password)) {// Возвращаем плохой запрос, если пароль является недействительным возврат BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = "Неверное имя пользователя или пароль" }); } // Теперь пользователь подтверждено, поэтому сброс счетчиков блокировки, в случае необходимости, если (_userManager.SupportsUserLockout) {ждут _userManager.ResetAccessFailedCountAsync (пользователь); } #Endregion вар идентичности = новый ClaimsIdentity (OpenIdConnectServerDefaults.AuthenticationScheme, OpenIdConnectConstants.Claims.Name, NULL); identity.AddClaim (OpenIdConnectConstants.Claims.Subject, user.Id, OpenIdConnectConstants.Destinations.AccessToken); identity.AddClaim (OpenIdConnectConstants.Claims.Name, user.DisplayName ?? user.username, OpenIdConnectConstants.Destinations.AccessToken); вар главная = новый ClaimsPrincipal (идентичность); вар билет = ждут CreateTicketAsync (основные, запрос, новые AuthenticationProperties ()); возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } Если (request.IsRefreshTokenGrantType) () {вар Информация о = ждут HttpContext.Authentication.GetAuthenticateInfoAsync (OpenIdConnectServerDefaults.AuthenticationScheme); вар ID = info.Principal.FindFirst (OpenIdConnectConstants.Claims.Subject) ?. Значение; VAR = пользователь ожидает _userManager.FindByIdAsync (ID); если (пользователь == NULL) {вернуть BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, не ErrorDescription = «Маркер обновления больше не действует.» }); } Если {вернуться BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = "Пользователь больше не имеет права войти в систему."}) (Ждать _signInManager.CanSignInAsync (пользователь)!); } Вар идентичности = новый ClaimsIdentity (OpenIdConnectServerDefaults.AuthenticationScheme, OpenIdConnectConstants.Claims.Name, NULL); identity.AddClaim (OpenIdConnectConstants.Claims.Subject, user.Id, OpenIdConnectConstants.Destinations.AccessToken); идентичность. AddClaim (OpenIdConnectConstants.Claims.Name, user.DisplayName ?? user.username, OpenIdConnectConstants.Destinations.AccessToken); // ... добавить другие претензии, в случае необходимости. вар главная = новый ClaimsPrincipal (идентичность); вар билет = ждут CreateTicketAsync (основной, требование, info.Properties); // Спрашивает OpenIddict генерировать новый маркер и возвращает маркер ответа OAuth2. возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } // Возвращаем плохой запрос, если запрос не возвращаемый тип гранта пароль BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.UnsupportedGrantType, ErrorDescription = «Указанный тип гранта не поддерживается.» }); } Частная асинхронной Task CreateTicketAsync (ClaimsPrincipal принципала, запрос OpenIdConnectRequest, AuthenticationProperties свойства = NULL) {// Создать новый билет аутентификации, удерживающий идентификатор пользователя. вар билет = новый AuthenticationTicket (принципал, свойство, OpenIdConnectServerDefaults.AuthenticationScheme); если {// TODO (request.IsRefreshTokenGrantType (!)): // Включить ресурсы и прицелы ** в APPROPRIATE ** // Установить список областей, предоставленных клиентское приложение. // Примечание: объем offline_access должен быть предоставлен // разрешить OpenIddict вернуть маркер обновления. ticket.SetScopes (новый [] {/ * OpenID: * / OpenIdConnectConstants.Scopes.OpenId, / * Адрес электронной почты: * / OpenIdConnectConstants.Scopes.Email, / * Профиль: * / OpenIdConnectConstants.Scopes.Profile, / * offline_access: * / OpenIdConnectConstants.Scopes.OfflineAccess, / * Роль: * / OpenIddictConstants.Scopes.Roles} .Intersect (request.GetScopes ())); } обратный билет; } #Region код авторизация, неявные и неявные потоки // Примечание: для поддержки интерактивных потоков, таких как поток кода, // Вы должны предоставить свои собственные действия конечной точки авторизации: [санкционировать HttpGet ( «авторизовать»)] общественность IActionResult Авторизоваться (запрос OpenIdConnectRequest ) {возврата OK (); }} #Endregion и это, как я отправить запрос: https: // локальный: 44380 / API / Счета / ExternalLogin / Google ReturnUrl = https: //? Локальный: 44380, который успешно возвращается к моему ExternalLoginCallback действий в AccountsController но не JWT лексемы посылаются обратно пользователю как обычный PasswordGrantFlow. Пожалуйста, если это возможно, пришлите мне код здесь и не перенаправляет меня где-то еще, потому что я совершенно новой для серверной части, а также я сделал мои поиски раньше.
Hesam Kashefi
1

голосов
2

ответ
471

Просмотры

OpenIddict error with AddSigningCertificate

Я пытаюсь сертификат зарегистрировался (OpenIddict), но я получаю сообщение об ошибке при попытке с отпечатком: options.AddSigningCertificate (Configuration [ "Certificate"] / * дб b9 12 .... 22 * ​​/); и ошибка: Application исключение при запуске: System.Security.Cryptography.CryptographicException: OpenCSP неудачу с кодом ошибки 2148073494. в этой строке: app.UseOpenIddict (); Если бы я попытался с X509Certificate2 я получаю ошибку: вар серт = новый X509Certificate2 (Configuration [ "Сертификат"] / * Путь к file.cer * /); options.AddSigningCertificate (серт); и ошибка: System.InvalidOperationException: Сертификат не содержит необходимый секретный ключ. в той же строке app.UseOpenIddict () ;. Я использую тот же сертификат, который я использую для протокола HTTPS. Это нормально? Мои активные маркеры случайным образом ушли (и я получаю invalid_token при попытке обновить маркер). Я нахожу где-то, что это произойдет, если используется AddEphemeralSigningKey, потому что, когда соединение обрывается (из IIS тайм-аут простоя), все маркеры теряются. Из-за того, что я пытаюсь использовать AddSigningCertificate. Есть ли другой способ? Может кто-нибудь сказать мне, что случилось с сертификатом? Спасибо. Я использую ASP.NET Ядро 1.1.1. Я добавить права чтения для пользователя IIS для .cer файла.
Makla
1

голосов
1

ответ
501

Просмотры

Openiddict Не удалось разрешить услугу типа «OpenIddict.Core.IOpenIddictApplicationStore`

Я пытаюсь настроить ядро ​​.net проект с использованием идентичности + авторизации JWT, но я получаю следующее сообщение об ошибке: System.InvalidOperationException: Не удается разрешить услугу типа "OpenIddict.Core.IOpenIddictApplicationStore1 [OpenIddict.Models.OpenIddictApplication] при попытке активировать "OpenIddict.Core.OpenIddictApplicationManager1 [OpenIddict.Models.OpenIddictApplication]. Вот моя конфигурация: открытый класс запуска {общественного запуска (IHostingEnvironment окр) {вар строитель = новый ConfigurationBuilder () .SetBasePath (env.ContentRootPath) .AddJsonFile ( "appsettings.json", по желанию: правда, reloadOnChange: правда) .AddJsonFile ( $ "AppSettings {env.EnvironmentName} .json", опционально: истина) .AddEnvironmentVariables (); Конфигурация = builder.Build (); } Конфигурация общественного IConfigurationRoot {получить; } // Этот метод вызывается средой выполнения. Используйте этот метод, чтобы добавить услуги в контейнер. общественный недействительный ConfigureServices (услуги IServiceCollection) {// Добавить рамочные услуги. services.AddMvc (); services.AddEntityFrameworkSqlServer () .AddDbContext (опции => {options.UseSqlServer (Конфигурация [ "Данные: DefaultConnection: ConnectionString"]); options.UseOpenIddict ();}); // добавить тождество services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders (); // добавить OpenIddict services.AddOpenIddict () .DisableHttpsRequirement () .EnableTokenEndpoint (» UseExceptionHandler ( "/ Home / Error"); } App.UseStaticFiles (); app.UseOpenIddict (); // использовать JWT носитель аутентификации app.UseJwtBearerAuthentication (новые JwtBearerOptions {AutomaticAuthenticate = верно, AutomaticChallenge = верно, RequireHttpsMetadata = ложь, аудитория = "HTTP: // локальный: 1804 /", Authority = "HTTP: // локальный: 1804 /" }); app.UseMvc (маршруты => {routes.MapRoute (название: "по умолчанию", шаблон: "{контроллер = Главная} / {действие = Индекс} / {ID}?"); routes.MapSpaFallbackRoute (название: «спа-резервный », по умолчанию: новый контроллер {= "Начало", действие = "Index"}); }); initializer.Seed (); }} Ошибка при попытке позвонить / API / AUTHENTICATE / маркер пути появляется. Может ли мне помочь в решении этой проблемы?
Łukasz Trzewik
1

голосов
1

ответ
1.2k

Просмотры

ASP.NET Web API ядра и OpenIddict

Я пытаюсь использовать OpenIddict к моей основной asp.net Web API проекта. Я следовал инструкции, написанные здесь, но когда я пытаюсь построить проект я получаю следующее сообщение об ошибке Не удается разрешить «OpenIddict.Mvc (> = 1.0.0)» для».NETCoreApp, Version = v1.1' . Я создал проект с помощью Visual Studio 2017 (я полагаю, у меня есть последний .NET Core, набор инструментов, установленный по умолчанию). Есть идеи? ОБНОВЛЕНИЕ: первый шаг инструкции говорит, что вы должны обновить свои пакеты для ссылки на пакетах ASP.NET ядро ​​RTM. Что это значит? И мой .csproj файл netcoreapp1.1 Я также попытался с версией = «1.0.0- *»
Kostis
1

голосов
1

ответ
360

Просмотры

Используйте неявный поток с OpenIdDict, не имея Вход / Регистрация Вид на сервер авторизации

То, что я пытаюсь сделать, это следующий: СП, который взаимодействует с Dotnet Ядра Wep API. Я хочу использовать социальные логины. Я хочу использовать поток (на стороне сервера) код авторизации. Я склонялся к OpenIdDict для обработки маркеров аутентификации JWT. Я настроил выборочные проекты OpenIdDict, в частности, ImplicitFlow и я получил эту работу. Но этот пример использует перенаправление на сервер авторизации для фактического процесса входа в систему. Возможно ли, чтобы эти страницы обслуживаемой попа SPA а? Кажется, это было сделано раньше, см: https://github.com/Kukks/openiddict-custom-grants-example Но я не могу получить, что доказательство концепции строить больше. То, что я хочу знать, является ли Kukks доказательство концепции по-прежнему путь для реализации этого и является ли я делаю правильно, желая это таким образом.
gijswijs
1

голосов
3

ответ
1.8k

Просмотры

UseOpenIdConnectServer не работает

Я только что обновил свой основной DotNet приложения WebAPI от netcoreapp1.0 до netcoreapp2.0. Я использую openiddict для аутентификации и авторизации на основе этого образца. Метод ConfigureServices: общественные пустоты ConfigureServices (услуги IServiceCollection) {services.AddCors (); services.AddMvc () AddJsonOptions (опции => {options.SerializerSettings.ContractResolver = новый Newtonsoft.Json.Serialization.DefaultContractResolver ();}). services.AddDbContext (опции => {options.UseSqlServer (@ "Server = SERVER1; Database = DB1; Пользователь Id = BLAHBLAH; Password = BLAHBLAHBLAH;"); options.UseOpenIddict ();}); services.AddIdentity (). AddEntityFrameworkStores () .AddDefaultTokenProviders (); services.Configure (опции => {options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name; options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject; options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;}); services.AddOpenIddict (опции => {options.AddEntityFrameworkCoreStores (); options.AddMvcBinders (); options.EnableTokenEndpoint ( "/ подключение / маркер"); options.AllowPasswordFlow (); options.DisableHttpsRequirement (); опция. SetAccessTokenLifetime (TimeSpan.FromMinutes (5)); }); services.AddAuthentication () .AddOAuthValidation (); } Настройка метода: общественного недействительными (приложение IApplicationBuilder, IHostingEnvironment ENV, ILoggerFactory loggerFactory) Настройка {loggerFactory.AddConsole (Configuration.GetSection ( "Вход")); loggerFactory.AddDebug (); app.UseCors (б => b.AllowAnyOrigin () AllowAnyHeader () AllowAnyMethod ()..); app.UseOpenIdConnectServer (Конфигурация => {configuration.AllowInsecureHttp = TRUE; configuration.Provider = новый AuthorizationProvider ();}); app.UseAuthentication (); приложение. UseMvc (); } Класс AuthorizationProvider: общественный класс запечатан AuthorizationProvider: OpenIdConnectServerProvider {общественного AuthorizationProvider () {} общественного переопределение асинхронной Task ApplyTokenResponse (ApplyTokenResponseContext контекст) {если (string.IsNullOrEmpty (context.Error)) {вар роли = context.Ticket.Principal.Claims .FirstOrDefault (д => q.Type == OpenIdConnectConstants.Claims.Role) .Value; переменная UserName = context.Ticket.Principal.Claims.FirstOrDefault (д => q.Type == OpenIdConnectConstants.Claims.Name) .Value; context.Response [ "роль"] = роль; context.Response [ "имя_пользователя"] = имя_пользователя; context.Response [ "выдан"] = DateTime.Now. ToUniversalTime () ToString ( "ддд, дд MMM YYYY HH: мм: сс 'GMT'."); [ "Expires "] context.Response = DateTime.Now.AddHours (8) .ToUniversalTime () ToString (" ддд, дд MMM YYYY HH: мм: сс 'GMT'."); } вернуть; }} Следующий код не работает: app.UseOpenIdConnectServer (Конфигурация => {configuration.AllowInsecureHttp = TRUE; configuration.Provider = новый AuthorizationProvider ();}); Он говорит: «IApplicationBuilder» не содержит определения для «UseOpenIdConnectServer» и не метод расширения «UseOpenIdConnectServer» принятие первого аргумента типа «IApplicationBuilder» может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?) Как решить это? Каков альтернативный метод для добавления пользовательского поставщика?
Amar Duplantier
1

голосов
1

ответ
385

Просмотры

openiddict password/refresh flow Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Authorization failed for user: (null)

i've been stuck for a few days trying to configure the PasswordFlow/Refresh sample and need some help on how to troubleshoot my issue. info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Authorization failed for user: (null). I tried the suggestion made by Kevin Chalet on July 19th to use OAuthValidationDefaults.AuthenticationScheme public class Startup { public IConfiguration Configuration { get; set; } private string _environmentName; private string _userAuthConnectionString; public Startup(IHostingEnvironment env) { Debug.WriteLine($"EnvironmentName:{env.EnvironmentName}"); _environmentName = env.EnvironmentName; var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{_environmentName.ToLower()}.json", optional: true); Configuration = builder.Build(); } // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { //services.AddCors(); services.AddMvc(); // Add framework services. ConfigureEntityFramework(services); ConfigureSettings(services); services.AddOptions(); ConfigureCustomServices(services); services.AddAuthorization(auth => ConfigureAuthorization(auth)); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); // Reference: http://benjii.me/2016/01/angular2-routing-with-asp-net-core-1/ // Route all unknown requests to app root app.Use(async (context, next) => { await next(); // If there's no available file and the request doesn't contain an extension, we're probably trying to access a page. // Rewrite request to use app root if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value)) { context.Request.Path = "/index.html"; // Put your Angular root page here await next(); } }); app.UseAuthentication(); // Reference: http://www.mithunvp.com/angular-2-in-asp-net-5-typescript-visual-studio-2015/ // For ASP.NET 5 to serve static files, we need to add StaticFiles middle ware in Configure method of StartUp.cs page. app.UseDefaultFiles(); app.UseStaticFiles(); app.UseMvc(); } private void ConfigureSettings(IServiceCollection services) { services.Configure(Configuration.GetSection("PortalAuthentication")); } private void ConfigureEntityFramework(IServiceCollection services) { //Configure with our Settings object var portalConnectionString = Configuration.GetSection("Data:DefaultConnection:ConnectionString").Value; _userAuthConnectionString = Configuration.GetSection("Data:UserAuthConnection:ConnectionString").Value; services.AddDbContext(options => { options.UseSqlServer(portalConnectionString); }); services.AddDbContext(options => { options.UseSqlServer(_userAuthConnectionString); // Register the entity sets needed by OpenIddict. // Note: use the generic overload if you need // to replace the default OpenIddict entities. options.UseOpenIddict(); }); // Register the Identity services. services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); #region may not need //services.ConfigureApplicationCookie(config => //{ // config.Events = new CookieAuthenticationEvents // { // OnRedirectToLogin = ctx => // { // if (ctx.Request.Path.StartsWithSegments("/api")) // { // ctx.RedirectUri = null; // ctx.Response.WriteAsync("{\"error\": " + ctx.Response.StatusCode + "}"); // } // else // { // ctx.Response.Redirect(ctx.RedirectUri); // } // return Task.FromResult(0); // } // }; //}); #endregion //https://github.com/openiddict/openiddict-samples/blob/dev/samples/PasswordFlow/AuthorizationServer/Startup.cs // Configure Identity to use the same JWT claims as OpenIddict instead // of the legacy WS-Federation claims it uses by default (ClaimTypes), // which saves you from doing the mapping in your authorization controller. services.Configure(options => { options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name; options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject; options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role; }); // Register the OpenIddict services. services.AddOpenIddict(options => { // Register the Entity Framework stores. options.AddEntityFrameworkCoreStores(); // Register the ASP.NET Core MVC binder used by OpenIddict. // Note: if you don't call this method, you won't be able to // bind OpenIdConnectRequest or OpenIdConnectResponse parameters. options.AddMvcBinders(); // Enable the token endpoint. options.EnableTokenEndpoint("/connect/token"); // Enable the password and the refresh token flows. options.AllowPasswordFlow() .AllowRefreshTokenFlow(); // During development, you can disable the HTTPS requirement. options.DisableHttpsRequirement(); // Note: to use JWT access tokens instead of the default // encrypted format, the following lines are required: options.UseJsonWebTokens(); options.AddEphemeralSigningKey(); }); services.AddAuthentication(options => { //options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = OAuthValidationDefaults.AuthenticationScheme; //options.DefaultChallengeScheme = OAuthValidation; }); #region not part of refresh token sample, nor password flow sample // this is not part of refresh token sample // use jwt bearer authentication var Events = new JwtBearerEvents { OnAuthenticationFailed = context => { return Task.FromResult(0); }, OnTokenValidated = context => { return Task.FromResult(0); } }; #endregion var portalURL = Configuration.GetSection("PortalURL").Value; // If you prefer using JWT, don't forget to disable the automatic // JWT -> WS-Federation claims mapping used by the JWT middleware: JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = portalURL; options.Audience = portalURL; options.RequireHttpsMetadata = false; options.Events = Events; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { NameClaimType = OpenIdConnectConstants.Claims.Subject, RoleClaimType = OpenIdConnectConstants.Claims.Role }; }); services.AddScoped(typeof(Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory), typeof(Portal.UserClaimsPrincipalFactory)); //services.AddScoped(); // shiro services.AddScoped(); } private void ConfigureAuthorization(Microsoft.AspNetCore.Authorization.AuthorizationOptions auth) { // Add Inline Authorization Policies var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseSqlServer(_userAuthConnectionString); var ctx = new AuthPortalDbContext(optionsBuilder.Options); foreach (var permission in ctx.Permission) { // Try to convert string to PermissionEnum type PermissionEnum permEnum; if (Enum.TryParse(permission.PermissionName, out permEnum)) { auth.AddPolicy(permission.PermissionName, policy => policy.Requirements.Add(new PermissionRequirement(permEnum))); } } } private static void ConfigureCustomServices(IServiceCollection services) { // Inject caching helper //services.AddTransient(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); } } I was able to successfully login but when I'm trying to make a GET call /api/company and getting this Authorization failed for user. I upgraded to .NET Core 2.0 and using Angular 2.0 (with angular-jwt). I'm getting the access token and refresh token. I'm able to decode the token on the browser. I would greatly appreciate the help! I also added the UserClaimsPrincipalFactory.cs public class UserClaimsPrincipalFactory : IUserClaimsPrincipalFactory where TUser : class where TRole : class { /// /// Initializes a new instance of the class. /// /// The to retrieve user information from. /// The to retrieve a user's roles from. /// The configured . public UserClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, IOptions optionsAccessor) { if (optionsAccessor == null || optionsAccessor.Value == null) { throw new ArgumentNullException(nameof(optionsAccessor)); } UserManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); RoleManager = roleManager ?? throw new ArgumentNullException(nameof(roleManager)); Options = optionsAccessor.Value; } /// /// Gets the for this factory. /// /// /// The current for this factory instance. /// public UserManager UserManager { get; private set; } /// /// Gets the for this factory. /// /// /// The current for this factory instance. /// public RoleManager RoleManager { get; private set; } /// /// Gets the for this factory. /// /// /// The current for this factory instance. /// public IdentityOptions Options { get; private set; } /// /// Creates a from an user asynchronously. /// /// The user to create a from. /// The that represents the asynchronous creation operation, containing the created . public virtual async Task CreateAsync(TUser user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } var userId = await UserManager.GetUserIdAsync(user); var userName = await UserManager.GetUserNameAsync(user); var id = new ClaimsIdentity( CookieAuthenticationDefaults.AuthenticationScheme, Options.ClaimsIdentity.UserNameClaimType, Options.ClaimsIdentity.RoleClaimType); id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId)); id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, userName)); //if (UserManager.SupportsUserSecurityStamp) //{ // id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType, // await UserManager.GetSecurityStampAsync(user))); //} if (UserManager.SupportsUserRole) { var roles = await UserManager.GetRolesAsync(user); foreach (var roleName in roles) { id.AddClaim(new Claim(Options.ClaimsIdentity.RoleClaimType, roleName)); if (RoleManager.SupportsRoleClaims) { var role = await RoleManager.FindByNameAsync(roleName); if (role != null) { id.AddClaims(await RoleManager.GetClaimsAsync(role)); } } } } if (UserManager.SupportsUserClaim) { id.AddClaims(await UserManager.GetClaimsAsync(user)); } return new ClaimsPrincipal(id); } } Here's the api that I'm calling. (nothing special) [Authorize] // Get the account profile information for the current user [Route("api/[controller]")] public class UserController : Controller { ILogger _logger; private readonly UserManager _userManager; private ICompanyService _companyService; private IUserService _userService; public UserController(ILoggerFactory loggerFactory, UserManager userManager, ICompanyService companyService, IUserService userService) { _logger = loggerFactory.CreateLogger(this.GetType().FullName); _userManager = userManager; _companyService = companyService; _userService = userService; } // GET: api/values [HttpGet] public async Task Get() { User _acct = null; var user = await _userManager.GetUserAsync(this.User); if (user != null) { var company = await _companyService.GetCompany(user.CompanyId); _acct = new User() { //AccountId = this.User. FirstName = user.FirstName, LastName = user.LastName, JoinDate = user.JoinDate, TermsOfAgreementDate = user.TermsOfAgreementDate, }; if (company != null) { _acct.CompanyId = company.CompanyId; _acct.CompanyName = company.CompanyName; } } return _acct; } // PUT api/values/5 // [HttpPut("{id}")] //public async Task Put(int id, [FromBody]DateTime agreedDate) [HttpPut] public async Task Put([FromBody]User acct) { //var user = await _userManager.GetUserAsync(this.User); ClaimsPrincipal currentUser = this.User; var user = await _userManager.FindByNameAsync(currentUser.Identity.Name); var currentUserId = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value; User _acct = new User { UserId = currentUserId, FirstName = user.FirstName, LastName = user.LastName, JoinDate = user.JoinDate, CompanyId = user.CompanyId, TermsOfAgreementDate = acct.TermsOfAgreementDate }; try { var result = await _userService.UpdateUser(_acct); } catch (Exception e) { _logger.LogError("Error found {0}", e.Message); } return true; } } Logs when my /api/user is called. Portal> info: OpenIddict.OpenIddictHandler[0] Portal> The token response was successfully returned: { Portal> "token_type": "Bearer", Portal> "access_token": "[removed for security reasons]", Portal> "expires_in": 3600, Portal> "refresh_token": "[removed for security reasons]" Portal> }. Portal> info: OpenIddict.OpenIddictHandler[0] Portal> The token response was successfully returned: { Portal> "token_type": "Bearer", Portal> "access_token": "[removed for security reasons]", Portal> "expires_in": 3600, Portal> "refresh_token": "[removed for security reasons]" Portal> }. Portal> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] Portal> Executed action Portal.Controllers.Api.AuthorizationController.Exchange (Portal) in 15839.2511ms Portal> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] Portal> Executed action Portal.Controllers.Api.AuthorizationController.Exchange (Portal) in 15839.2511ms Portal> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Portal> Request finished in 16289.7179ms 200 application/json;charset=UTF-8 Portal> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Portal> Request finished in 16289.7179ms 200 application/json;charset=UTF-8 Portal> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Portal> Request starting HTTP/1.1 GET http://localhost:49142/api/user/ application/json Portal> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Portal> Request starting HTTP/1.1 GET http://localhost:49142/api/user/ application/json Portal> info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Portal> Authorization failed for user: (null). Portal> info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Portal> Authorization failed for user: (null). Portal> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3] Portal> Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. Portal> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3] Portal> Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. Portal> info: Microsoft.AspNetCore.Mvc.ChallengeResult[1] Portal> Executing ChallengeResult with authentication schemes (). Portal> info: Microsoft.AspNetCore.Mvc.ChallengeResult[1] Portal> Executing ChallengeResult with authentication schemes (). Portal> info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[12] Portal> AuthenticationScheme: Identity.Application was challenged. Portal> info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[12] Portal> AuthenticationScheme: Identity.Application was challenged. Portal> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] Portal> Executed action Portal.Controllers.Api.UserController.Get (Portal) in 5947.5521ms Portal> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] Portal> Executed action Portal.Controllers.Api.UserController.Get (Portal) in 5947.5521ms Portal> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Portal> Request finished in 5979.075ms 302 Portal> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Portal> Request finished in 5979.075ms 302
minerva
1

голосов
1

ответ
213

Просмотры

Маркер ответ был успешно возвращен: unsupported_grant_type

Я мигрируют из .NET Ядра 1,1 до 2,0, и теперь я должен обновить Authentication тоже. Я использую OAuth и OpenIddict для .NET 2.0 Ядра Когда я отправляю запрос на мой подключение / лексема я получаю это: OpenIddict.Server.OpenIddictServerHandler [0] Маркер ответ был успешно возвращен: { «ошибка»: «unsupported_grant_type», «error_description»: «указанный параметр„grant_type“не поддерживается.» }. Это мой метод запроса: использование (вар клиент = новый HttpClient ()) {запрос переменного = новый HttpRequestMessage (HttpMethod.Post, $ "{URL} / подключение / маркер"); request.Content = новый FormUrlEncodedContent (новый словарь {[ "grant_type"] = "client_credentials", [ "client_id"] = ClientId, [ "client_secret" ] = ClientSecret, [ "pessoaid"] = pessoaId, [ "usuarioid"] = usuarioId, [ "CONTA"] = CONTA, [ "cpfcnpj"] = userDoubleCpf, [ "fonteDados"] = fonteDados, [ "userIdsLogged"] = userIdsLogged}); Ответ вар = ждут client.SendAsync (запрос, HttpCompletionOption.ResponseContentRead); response.EnsureSuccessStatusCode (); вар результат = JObject.Parse (ждут response.Content.ReadAsStringAsync ()); если (! результат [ «ошибка»] = NULL) {певд InvalidOperationException ( «Произошла ошибка при получении маркера доступа.»); } Возвращаемый результат; } Мои OpenIddictApplications генерируется, когда приложение связано с учетной записью пользователя, поэтому ClientId и Секретной генерируется, когда запрос Войти отправляется на мой API и получить соответствующие значения. Я folowed документации oppeniddict и я включил все, что в моем Startup.cs Это мой AuthorizationController: [HttpPost ( «~ / подключении / маркер»), Производит ( «приложение / JSON»)] общественность асинхронного Обмена задач (запрос OpenIdConnectRequest) {Debug.Assert (request.IsTokenRequest (), "О OpenIddict связующее для ASP.NET MVC ядра не зарегистрирован." + "Убедитесь, что services.AddOpenIddict () AddMvcBinders () правильно называется.."); если (request.IsClientCredentialsGrantType ()) {// Примечание: учетные данные клиента автоматически подтверждено OpenIddict: // если client_id или client_secret являются недействительными, это действие не будет вызван. вар приложения = ждет _applicationManager. FindByClientIdAsync (request.ClientId, HttpContext.RequestAborted); если (приложение == NULL) {вернуть BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidClient, ErrorDescription = "Клиентское приложение не был найден в базе данных."}); } // Создать новый билет проверки подлинности. Билет вар = CreateTicket (запрос, приложение); возвращать (ticket.Principal зарегистрировались, ticket.Properties, ticket.AuthenticationScheme); } Вернуть BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.UnsupportedGrantType, ErrorDescription = "Указанный тип гранта не поддерживается."}); } Я генерирование AuthenticationTicket и возвращение этого.
Pedro Franco
0

голосов
0

ответ
2

Просмотры

Добавление идентичности ломает OpenIddict

Я выполняю точный пример из примера OpenIddict здесь: https://github.com/openiddict/openiddict-core. Все работает, пока я не использовать часть AddIdentity. Мне действительно нужно использовать идентичность. Комментирование тождественность часть будет работать, если раскомментировать, то я получаю 404 на методе Получить в тестовом контроллере, потому что он не разрешит. Я использую .Net Ключевого 2.x Startup.cs: общественные недействительные ConfigureServices (услуги IServiceCollection) {services.AddMvc (); services.AddDbContext (опции => {options.UseSqlServer (конфигурации [ "по умолчанию: ConnectionString"]); options.UseOpenIddict ();}); services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders (); services.AddOpenIddict () .AddCore (опции => {Options.UseEntityFrameworkCore () .UseDbContext (); }) .AddServer (опции => {options.UseMvc (); options.EnableTokenEndpoint ( "/ подключить / маркер"); options.AllowPasswordFlow (); options.DisableHttpsRequirement (); options.AcceptAnonymousClients ();}) .AddValidation ( ); } Общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment ENV, ILoggerFactory loggerFactory) {app.UseAuthentication (); app.UseMvc (); } AspUser.cs: общественный класс AspUser: IdentityUser {} XXIdentityContext.cs: общественный класс XXIdentityContext: IdentityDbContext {частный наследуют IConfiguration конфигурации; общественный XXIdentityContext (опции DbContextOptions, наследует IConfiguration конфигурация): база (опция) {this.config = конфигурация; } Защищен переопределение недействительный OnModelCreating (ModelBuilder строитель) {base.OnModelCreating (строитель); }} TestController.cs: класс TestController общественности: Controller {[HttpPost ( "~ / подключение / маркер"), Производит ( "приложение / JSON")] общественность IActionResult Обмен (запрос OpenIdConnectRequest) {вар претензия = новый список {новой Претензия ( ClaimsConstants.Id, "Боб"), новые претензии (ClaimsConstants.Temp, 5.ToString ()), новые претензии (OpenIdConnectConstants.Claims.Subject, "Проверка")}; Еогеасп (вар претензии в формуле изобретения) претензии. SetDestinations (OpenIdConnectConstants.Destinations.AccessToken); вар главная = новый ClaimsPrincipal (новый ClaimsIdentity (претензии, "OpenIddict")); Возвращение зарегистрировались (основной, OpenIddictServerDefaults.AuthenticationScheme); } [Авторизовать, HttpGet ( "~ / API / тест")] общественность IActionResult GetMessage () {возвращение JSON (новый {Тема = User.GetClaim (OpenIdConnectConstants.Claims.Subject), Id = User.GetClaim (ClaimsConstants.Id), Темп = User.GetClaim (ClaimsConstants.Temp)}); }} )] Общественного IActionResult GetMessage () {возвращение JSON (новый {Тема = User.GetClaim (OpenIdConnectConstants.Claims.Subject), Id = User.GetClaim (ClaimsConstants.Id), Temp = User.GetClaim (ClaimsConstants.Temp)}); }} )] Общественного IActionResult GetMessage () {возвращение JSON (новый {Тема = User.GetClaim (OpenIdConnectConstants.Claims.Subject), Id = User.GetClaim (ClaimsConstants.Id), Temp = User.GetClaim (ClaimsConstants.Temp)}); }}
bnorman
1

голосов
1

ответ
3.3k

Просмотры

OpenIddict - Как получить маркер доступа для пользователя?

Я работаю над приложением образца для OpenIddict с помощью AngularJs. Мне сказали, что вы не должны использовать клиентскую базу, как Satellizer, как рекомендовано это разве, но вместо того, чтобы позволить серверу иметь дело с лесозаготовок в стороне сервера (локально, так и с помощью внешних поставщиков входа), и возвращает маркер доступа. Ну у меня есть приложение демо angularJs и использует на сторону сервера логику входа и перезванивает угловое приложение, но моя проблема в том, как я могу получить маркер доступа для текущего пользователя? вот мой файл startup.cs, так что вы можете увидеть мои настройки до сих пор государственных недействительных ConfigureServices (услуги IServiceCollection) {уага конфигурации = новый ConfigurationBuilder () .AddJsonFile ( "config.json") .AddEnvironmentVariables () .build (); services.AddMvc (); services.AddEntityFramework () .AddSqlServer (). AddDbContext (опции => options.UseSqlServer (конфигурация [ "Данные: DefaultConnection: ConnectionString"])); services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders () .AddOpenIddict (); services.AddTransient (); services.AddTransient (); } Общественного недействительными (приложение IApplicationBuilder, IHostingEnvironment окр) Настройка {env.EnvironmentName = "Разработка"; вар завод = app.ApplicationServices.GetRequiredService (); factory.AddConsole (); factory.AddDebug (); app.UseDeveloperExceptionPage (); app.UseIISPlatformHandler (опции => {options.FlowWindowsAuthentication = ложь;}); app.UseOverrideHeaders (опции => {options.ForwardedOptions = ForwardedHeaders.All;}); app.UseStaticFiles (); // Добавление промежуточного уровня, используемые для проверки доступа // маркеров и защиты API конечных точек. app.UseOAuthValidation (); // закомментируйте и вы получите ошибку, говорящую // InvalidOperationException: Нет обработчика аутентификации не настроен для обработки по схеме: Microsoft.AspNet.Identity.External app.UseIdentity (); // ТОО: Удалить app.UseGoogleAuthentication (параметры => {options.ClientId = "XXX"; options.ClientSecret = "XXX";}); app.UseTwitterAuthentication (опции => {options.ConsumerKey = "XXX"; options.ConsumerSecret = "XXX";}); // Примечание: OpenIddict должны быть добавлены после // ASP.NET Идентичность и внешних поставщиков. app.UseOpenIddict (опции => {options.Options.AllowInsecureHttp = истина; options.Options.UseJwtTokens (); }); app.UseMvcWithDefaultRoute (); используя (контекст переменная = app.ApplicationServices.GetRequiredService ()) {context.Database.EnsureCreated (); // Добавление Mvc.Client к известным приложениям. если {context.Applications.Add (новый Application {Id = "myClient", DisplayName = "Мой клиент приложение", RedirectUri = "HTTP: // локальный: 5000 / входа в аккаунт" (context.Applications.Any (!)), LogoutRedirectUri = "HTTP: // локальный: 5000 /", Secret = Crypto.HashPassword ( "secret_secret_secret"), Type = OpenIddictConstants.ApplicationTypes.Confidential}); context.SaveChanges (); }}} Теперь моя AccountController в основном так же, как нормальный контроллер счета, хотя когда пользователи вошли в систему (используя локальный и внешний входа в аккаунт) я использовать эту функцию, если требуется маркер доступа. частный IActionResult RedirectToAngular () {// Я нужен здесь маркер доступа вернуть RedirectToAction (nameof (AccountController.Angular), новый {маркер доступа = маркер}); } Как видно из метода ExternalLoginCallback на публике AccountController асинхронном Task ExternalLoginCallback (строка ReturnUrl = NULL) {вар Информация = ждут _signInManager.GetExternalLoginInfoAsync (); если (информация == NULL) {вернуться RedirectToAction (nameof (Вход)); } // Вход пользователя с этим внешним провайдером авторизации, если пользователь уже имеет логин. результат переменная = ждут _signInManager.ExternalLoginSignInAsync (info.LoginProvider, info.ProviderKey, isPersistent: ложь); если (result.Succeeded) {// не должно ПОЛЬЗОВАТЕЛЬ иметь локальный маркер доступа сейчас ?? вернуть RedirectToAngular (); } Если (result.RequiresTwoFactor) {вернуть RedirectToAction (nameof (SendCode), новый {ReturnUrl = ReturnUrl}); } Если (result.IsLockedOut) {вернуться View ( "Lockout"); } Еще {// Если пользователь не имеет учетной записи, затем попросите пользователя, чтобы создать учетную запись. ViewData [ "ReturnUrl"] = ReturnUrl; ViewData [ "LoginProvider"] = info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }} Преемник) {// не должно ПОЛЬЗОВАТЕЛЬ иметь локальный маркер доступа сейчас ?? вернуть RedirectToAngular (); } Если (result.RequiresTwoFactor) {вернуть RedirectToAction (nameof (SendCode), новый {ReturnUrl = ReturnUrl}); } Если (result.IsLockedOut) {вернуться View ( "Lockout"); } Еще {// Если пользователь не имеет учетной записи, затем попросите пользователя, чтобы создать учетную запись. ViewData [ "ReturnUrl"] = ReturnUrl; ViewData [ "LoginProvider"] = info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }} Преемник) {// не должно ПОЛЬЗОВАТЕЛЬ иметь локальный маркер доступа сейчас ?? вернуть RedirectToAngular (); } Если (result.RequiresTwoFactor) {вернуть RedirectToAction (nameof (SendCode), новый {ReturnUrl = ReturnUrl}); } Если (result.IsLockedOut) {вернуться View ( "Lockout"); } Еще {// Если пользователь не имеет учетной записи, затем попросите пользователя, чтобы создать учетную запись. ViewData [ "ReturnUrl"] = ReturnUrl; ViewData [ "LoginProvider"] = info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }} Новый {ReturnUrl = ReturnUrl}); } Если (result.IsLockedOut) {вернуться View ( "Lockout"); } Еще {// Если пользователь не имеет учетной записи, затем попросите пользователя, чтобы создать учетную запись. ViewData [ "ReturnUrl"] = ReturnUrl; ViewData [ "LoginProvider"] = info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }} Новый {ReturnUrl = ReturnUrl}); } Если (result.IsLockedOut) {вернуться View ( "Lockout"); } Еще {// Если пользователь не имеет учетной записи, затем попросите пользователя, чтобы создать учетную запись. ViewData [ "ReturnUrl"] = ReturnUrl; ViewData [ "LoginProvider"] = info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }} ] = Info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }} ] = Info.LoginProvider; вар электронная почта = info.ExternalPrincipal.FindFirstValue (ClaimTypes.Email); вернуться View ( "ExternalLoginConfirmation", новый ExternalLoginConfirmationViewModel {Email = электронной почты}); }}
Gillardo
1

голосов
1

ответ
274

Просмотры

ASP.NET ОСНОВНОЙ 2.0 - [Авторизоваться] doen't блокировать доступ к REST API для несанкционированных пользователей

Я только учусь ASP.NET CORE. Я успешно реализовал openiddict, чтобы добиться моего апи. После успешного пользователь Войти получает маркер и маркер используется для доступа к веб-API, но она позволяет неавторизованных пользователей тоже (т.е. тот, кто does't есть маркер) Это, как я организованы пространства имен контроллера ISIA.Controllers {[Авторизоваться] [Маршрут ( "апи / [контроллер]")] общественный класс PostController: контроллер {частный IPostService _postService только для чтения; частная чтение PostToPostViewModelMapper _mapper; общественного PostController (IPostService PostService) {_postService = PostService; _mapper = новый PostToPostViewModelMapper (); DisableHttpsRequirement (); options.UseRollingTokens (); // Раскоментируйте обновить токенов обновления на каждом запросе refreshToken // options.AddSigningKey (новый SymmetricSecurityKey (System.Text.Encoding.ASCII.GetBytes (Configuration [ "STSKey"]))); options.Configure (конфигурации => {// Включение скользящего действия config.UseSlidingExpiration = TRUE; config.AccessTokenLifetime = TimeSpan.FromMinutes (240); config.RefreshTokenLifetime = TimeSpan.FromDays (15);}); }); Что я делаю неправильно, пожалуйста, помогите мне. Text.Encoding.ASCII.GetBytes (Конфигурация [ "STSKey"]))); options.Configure (конфигурации => {// Включение скользящего действия config.UseSlidingExpiration = TRUE; config.AccessTokenLifetime = TimeSpan.FromMinutes (240); config.RefreshTokenLifetime = TimeSpan.FromDays (15);}); }); Что я делаю неправильно, пожалуйста, помогите мне. Text.Encoding.ASCII.GetBytes (Конфигурация [ "STSKey"]))); options.Configure (конфигурации => {// Включение скользящего действия config.UseSlidingExpiration = TRUE; config.AccessTokenLifetime = TimeSpan.FromMinutes (240); config.RefreshTokenLifetime = TimeSpan.FromDays (15);}); }); Что я делаю неправильно, пожалуйста, помогите мне.
Nishan
1

голосов
1

ответ
1.1k

Просмотры

InvalidOperationException: Scheme already exists: Bearer

I recently resumed work on a project that had lain dormant for a year. It was using Angular on AspNet Core 1.1 and using an early version of OpenIddict 1.0. It was developed using VS2017. I updated VS2017 to the latest release (15.7.5) but the project would not compile and when I fixed the compilation errors it wouldn't run. So eventually I bit the bullet and decided to update the project to Asp Net Core 2.1 and to use the latest version of OpenIddict. I have the project so it compiles but when it starts it gives the error in the title, namely "InvalidOperationException: Scheme already exists: Bearer" I can't see what is wrong. I understand that somewhere a second scheme named 'Bearer' is being added, but I can't figure out where. I am enclosing below my Startup.cs in its entirety. using AspNet.Security.OpenIdConnect.Primitives; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using SIAngular.DBContexts; using SIAngular.Models; using SIAngular.Services; using OpenIddict.Abstractions; using System.IdentityModel.Tokens.Jwt; using Microsoft.IdentityModel.Tokens; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Authentication.JwtBearer; namespace SIAngular { public class Startup { public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddCors(); services.AddMvc(); services.AddDbContext(options => { // Configure the context to use Microsoft SQL Server. options.UseSqlServer(Configuration.GetConnectionString("SqlConnection")); // Register the entity sets needed by OpenIddict. // Note: use the generic overload if you need // to replace the default OpenIddict entities. options.UseOpenIddict(); }); // Register the Identity services. services.AddIdentity() .AddEntityFrameworkStores(); //.AddDefaultTokenProviders(); // Configure Identity to use the same JWT claims as OpenIddict instead // of the legacy WS-Federation claims it uses by default (ClaimTypes), // which saves you from doing the mapping in your authorization controller. services.Configure(options => { options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name; options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject; options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role; }); services.AddOpenIddict() // Register the OpenIddict core services. .AddCore(options => { // Configure OpenIddict to use the Entity Framework Core stores and models. options.UseEntityFrameworkCore() .UseDbContext(); }) // Register the OpenIddict server services. .AddServer(options => { // Register the ASP.NET Core MVC services used by OpenIddict. // Note: if you don't call this method, you won't be able to // bind OpenIdConnectRequest or OpenIdConnectResponse parameters. options.UseMvc(); // Enable the token endpoint. options .EnableTokenEndpoint("/connect/token"); options.AcceptAnonymousClients(); options.DisableScopeValidation(); // Note: the Mvc.Client sample only uses the code flow and the password flow, but you // can enable the other flows if you need to support implicit or client credentials. options.AllowPasswordFlow(); // Mark the "email", "profile" and "roles" scopes as supported scopes. options.RegisterScopes(OpenIdConnectConstants.Scopes.Email, OpenIdConnectConstants.Scopes.Profile, OpenIddictConstants.Scopes.Roles); // During development, you can disable the HTTPS requirement. options.DisableHttpsRequirement(); // Note: to use JWT access tokens instead of the default // encrypted format, the following lines are required: // options.UseJsonWebTokens(); options.AddEphemeralSigningKey(); }) // Register the OpenIddict validation services. .AddValidation(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear(); services.AddAuthentication(o => { o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.Authority = "http://localhost:53244/"; options.Audience = "resource_server"; options.RequireHttpsMetadata = false; //options.IncludeErrorDetails = true; options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = OpenIdConnectConstants.Claims.Subject, RoleClaimType = OpenIdConnectConstants.Claims.Role }; }); services.AddTransient(); services.AddTransient(); } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); app.UseAuthentication(); app.UseStaticFiles(); app.UseMvcWithDefaultRoute(); } } } Can someone please exp-lain what I am doing wrong. My intent was to follow the OpenIddict examples but clearly I went wrong somewhere. The full stacktrace follows: System.InvalidOperationException: Scheme already exists: Bearer at Microsoft.AspNetCore.Authentication.AuthenticationOptions.AddScheme(String name, Action`1 configureBuilder) at Microsoft.AspNetCore.Authentication.AuthenticationBuilder.c__DisplayClass4_0`2.b__0(AuthenticationOptions o) at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) at Microsoft.Extensions.Options.OptionsManager`1.c__DisplayClass5_0.b__0() at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) at Microsoft.Extensions.Options.OptionsManager`1.get_Value() at Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider..ctor(IOptions`1 options, IDictionary`2 schemes) at Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider..ctor(IOptions`1 options) --- End of stack trace from previous location where exception was thrown --- at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider) at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters) at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.c__DisplayClass4_0.b__0(RequestDelegate next) at Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder.Build() at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication() at Microsoft.AspNetCore.Hosting.Internal.WebHost.StartAsync(CancellationToken cancellationToken) at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token, String shutdownMessage) at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token) at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host) at SIAngular.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2017\Projects\SIAngular\Program.cs:line 20
Martin Horton
1

голосов
1

ответ
0

Просмотры

Получение претензий от Google в ASP.Net Ядра 2.1 с использованием OpenIdDict

У меня возникли некоторые проблемы при получении претензии от Google в виде ASP.Net ядра 2.1 Web API с использованием OpenIdDict. Я не выбрал «Без проверки подлинности» в шаблоне ASP.Net MVC, так как у меня нет никакого интереса к хранению логинов / паролей себя. Я буду полагаться на внешних поставщиков (например, Google) для проверки подлинности. Клиент является SPA, поэтому я использую неявную Flow. Мой код основан на следующих этот учебник (за исключением использования Google, а не GitHub): https://www.jerriepelser.com/blog/implementing-openiddict-authorization-server-part-2/ токен возвращается из Google - но когда я исследую JWT не содержит никакой информации претензий. Что мне не хватает? Мой Startup.cs выглядит следующим образом: общественный класс запуск {общественного запуск (конфигурация) {наследуют IConfiguration Configuration = конфигурация; } Конфигурация общественного {наследуют IConfiguration получить; } // Этот метод вызывается средой выполнения. Используйте этот метод, чтобы добавить услуги в контейнер. общественный недействительный ConfigureServices (услуги IServiceCollection) {// База данные Регистрации OpenIdDict (EF ядро) services.AddDbContext (о => {o.UseSqlServer (Configuration.GetConnectionString ( "AuthorizationDbContext")); o.UseOpenIddict ();}); // Проверка подлинности services.AddAuthentication (авт => {auth.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; auth.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; auth.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;}). AddCookie () .AddGoogle (о => {o.ClientId = Конфигурация [ "Аутентификация: Google: ClientID"; o.ClientSecret = Конфигурация [ "Аутентификация: Google: ClientSecret"]; o.CallbackPath = "/ Google-зарегистрировались"; }); services.AddOpenIddict () .AddCore (о => o.UseEntityFrameworkCore () UseDbContext ().) .AddServer (о => {o.UseMvc (); // Регистрация MVC Binder o.EnableAuthorizationEndpoint ( "/ подключения / авторизовать") .EnableLogoutEndpoint ( "/ подключить / выход из системы"); // Включить o.RegisterScopes авторизации конечной точки (OpenIddictConstants.Scopes.Email, OpenIddictConstants.Scopes.Profile, OpenIddictConstants.Scopes.Roles); o.AllowImplicitFlow (); // Включить неявный поток (т.е. аутентификация OAuth2 для SPA-х) o.EnableRequestCaching (); o.DisableHttpsRequirement (); // DEV ТОЛЬКО! o.AddEphemeralSigningKey (); // DEV ТОЛЬКО! }) .AddValidation (); // Cors services.AddCors (); . Services.AddMvc () SetCompatibilityVersion (CompatibilityVersion.Version_2_1); } Общественного недействительными Настройка (IApplicationBuilder приложение, IHostingEnvironment окр) {app.UseCors (строитель => {строитель. WithOrigins ( "https: // локальный: 5001"); builder.WithMethods ( "GET"); builder.WithHeaders ( "авторизация"); }); app.UseAuthentication (); app.UseMvcWithDefaultRoute (); app.MigrateDatabase (); // Настройка базы данных OpenIdDict (не показан) InitializeAsync (app.ApplicationServices, CancellationToken.None) .GetAwaiter () GetResult (). } И мой метод Authenticate: [HttpGet ( "~ / подключения / авторизовать")] общественность IActionResult Авторизоваться (запрос OpenIdConnectRequest) {если (! User.Identity.IsAuthenticated) вернуть вызов ( "Google"); вар претензия = новый список (); claims.Add (новые претензии (OpenIdConnectConstants.Claims.Subject, User.FindFirstValue (ClaimTypes.NameIdentifier), OpenIdConnectConstants.Destinations. IdentityToken)); claims.Add (новое требование (OpenIdConnectConstants.Claims.Name, User.FindFirstValue (ClaimTypes.Name), OpenIdConnectConstants.Destinations.IdentityToken)); claims.Add (новое требование (OpenIdConnectConstants.Claims.Email, User.FindFirstValue (ClaimTypes.Email), OpenIdConnectConstants.Destinations.IdentityToken)); claims.Add (новые претензии (OpenIdConnectConstants.Claims.EmailVerified, "истинный", OpenIdConnectConstants.Destinations.IdentityToken)); вар идентичность = новый ClaimsIdentity (претензии, "OpenIddict"); Принцип переменная = новый ClaimsPrincipal (идентичность); // Создать новый Authentication Ticket уаг билет = новый AuthenticationTicket (принцип, новые AuthenticationProperties (), OpenIdConnectServerDefaults.AuthenticationScheme); вернуться (ticket.Principal зарегистрировались, билет. Свойства, ticket.AuthenticationScheme); } Заранее спасибо.
NathanS
4

голосов
2

ответ
304

Просмотры

OpenId Connect возобновлять access_token в SPA

Попытка реализовать OpenId соединение в веб-приложение, состоящее из следующих компонентов идентификации поставщика ресурсов сервера одной странице приложения, действующей в качестве Клиента. Идентичность поставщик и ресурсы сервера один и то же приложение. SPA Flow использование пароля для получения access_token и хранит в куки. Хранение access_token в печенье имеет это защитные нити, но это совсем другая история. Проблема access_token выданную IdP истекла через 30 мин и SPA необходимо обновить маркер, не спрашивая пользователь учетных данных снова. Решение IdP возвращает refresh_token вместе с access_token. Всякий раз, когда SPA получает 401 из ресурсов сервера, он посылает refresh_token к IdP и получить новый access_token назад. Проблема Отправка refresh_token в SPA является плохой практикой. Однократное применение Page (обычно реализации неявной Грант) не должны ни при каких обстоятельствах получить токен обновления. Причиной этого является чувствительность этой части информации. Вы можете думать о нем, как учетные данные пользователя поскольку токен обновления позволяет пользователю оставаться проверкой подлинности по существу навсегда. Поэтому вы не можете иметь эту информацию в браузере, он должен храниться в надежном месте. Предлагаемое решение Когда Токен доступа истекло, бесшумные аутентификации могут быть использованы для получения нового без взаимодействия с пользователем, при условии, SSO сеанс пользователя не истек. Я думаю, что Бесшумная аутентификация не применяется к Фему паролю при IdP и ресурсах сервера таким же приложение. access_token выданной IdP только часть информации, которая может быть использована для авторизации против ресурсов сервера / IdP после истечения срока его действия, как клиент может убедить IdP выпустить новый access_token? (Без отправки refresh_token) Найдена угловой-oauth2-РСИНА библиотека, которая использует refresh_token возобновить access_token. Что лучше практик / решение в этом случае возобновить access_token? технические данные Идентичность Provider - библиотека ASP.NET Ядро + Openiddict. SPA - AngularJs применение.
tchelidze
5

голосов
2

ответ
2.7k

Просмотры

.net ядро ​​- ключ подписи подлинности промежуточного JWT игнорируется

Я использую openiddict, который выполнен с возможностью использовать JSon веб-токены: // Добавляет аутентификацию services.AddAuthentication (); // Добавить OpenId Connect / OAuth2 services.AddOpenIddict () .AddEntityFrameworkCoreStores () .AddMvcBinders () .EnableTokenEndpoint ( "/ подключения / маркер") .AllowPasswordFlow () .AllowRefreshTokenFlow () .UseJsonWebTokens () // access_token должна быть JWT // Вы можете отключить требование HTTPS в процессе разработки или если за обратным прокси .DisableHttpsRequirement () // Регистрация нового эфемерный ключ, который отбрасывается, когда приложение // выключается. Лексемы, подписанные с помощью этого ключа автоматически аннулируются. // Для использования в процессе .AddEphemeralSigningKey развития (); Я настроен JWT промежуточного слоя в следующем порядке: // Добавление JWT промежуточного ПО для аутентификации вар SecretKey = Configuration.Get () Jwt.SecretKey. app.UseJwtBearerAuthentication (новые JwtBearerOptions {AutomaticAuthenticate = верно, AutomaticChallenge = верно, RequireHttpsMetadata = env.IsProduction (), аудитории = Configuration.Get (). Jwt.Audience, орган = Configuration.Get (). Jwt.Authority, TokenValidationParameters = новый TokenValidationParameters {ValidateIssuerSigningKey = истинный, IssuerSigningKey = новый SymmetricSecurityKey (Encoding.ASCII.GetBytes (SecretKey)), ValidateIssuer = правда, // делает никакой разницы, казалось бы, не игнорируется // ValidIssuer = Configuration.Get (). Jwt.Authority, ValidateAudience = истина ., ValidAudience = Configuration.Get () Jwt.Audience, ValidateLifetime = верно,}}); // Добавление OpedId Connect промежуточного app.UseOpenIddict (); Как вы можете видеть, ключ подписи эмитента устанавливается на симметричном ключе: IssuerSigningKey = новый SymmetricSecurityKey (Encoding.ASCII.GetBytes (SecretKey)), но JWT access_tokens создали бы ALG требование установлено в RS256, так что кажется, что этот параметр игнорируется и openiddict использует закрытый ключ RSA подписать маркер генерируется из .AddEphemeralSigningKey ();
adnan kamili
4

голосов
2

ответ
1.5k

Просмотры

OpenID Connect - определение арендатора во время входа

У меня есть приложение с несколько жильца (одна базы данных), которая позволяет за те же имя пользователя / адрес электронной почты между различными арендаторами. В момент входа в систему (неявный поток), как я могу определить арендатора? Я думал о следующих возможностях: Во время регистрации попросите пользователь для учетной записи слизня (компания / арендатор пробкового) и во время входа пользователя должен предоставить слизняк вместе с именем пользователя и паролем. Но нет никакого параметра в запросе Open ID отправить слизняк. Создание приложения OAuth в момент регистрации и использования в качестве слизняка client_id. В момент входа в проход слаге в client_id, который я буду использовать для извлечения Id арендатора и идти дальше для проверки пользователя. Является ли этот подход отлично? Edit: Также попытался сделать пробковую часть маршрута паров .EnableTokenEndpoint ( «/ подключения / {} слизняка / маркер»); но openiddict не поддерживает это.
adnan kamili
3

голосов
1

ответ
1.9k

Просмотры

Как авторизовать метод SignalR Основной хаб с JWT

Я использую проверку подлинности JWT в моем ASP.NET 2.0 ядра приложения с OpenIddict. Я, по идее в этом потоке и вызов метода AuthorizeWithJWT после SignalR рукопожатия. Но сейчас, я не знаю, что я должен установить в методе AuthorizeWithJWT, так что я могу использовать [Авторизовать (Roles = «Admin»)], например. Я попытался с заходящим пользователем контекста, но это только для чтения: BaseHub общественного класса: Hub {общественного асинхронной Task AuthorizeWithJWT (строка) {маркер доступа // получить требования пользователей из AccesToken this.Context.User = пользователя; // Ошибка пользователя только для чтения}} и используя авторизовать атрибут: общественный класс VarDesignImportHub: BaseHub {[авторизовать (роли = "Admin")] общественность асинхронной задач импорта (строка ConnectionString) {}}
Makla
5

голосов
1

ответ
1.1k

Просмотры

userManager.FindByName не возвращает роли

Я использую OpenIddict для маркеров аутентификации. Вчера, когда я называю userManager.FindByNameAsync (request.Username) Я получаю пользователя с ролями. Сегодня я получаю пользователь графа Роли собственности = 0. Я пытался загрузить роли с ждать userManager.GetRolesAsync (пользователь); и я получаю массив подсчета 3. Это означает, что пользователь имеет роли. Я не знаю, что изменилось, но как я могу загрузить пользователя с ролями с функцией FindByNameAsync? Полный код: [HttpPost ( "маркера"), производит ( "приложения / JSON")] общественность асинхронной биржи (Task запроса OpenIdConnectRequest) {Debug.Assert (request.IsTokenRequest (), «О OpenIddict связующее для ASP.NET MVC ядра является не зарегистрирован "+ "Убедитесь, что services.AddOpenIddict () AddMvcBinders () правильно называется")...; если (request.IsPasswordGrantType ()) {вар пользователя = userManager ждут. FindByNameAsync (request.Username); // роли счетчика 0, если (пользователь == NULL) {вернуть BadRequest (новый OpenIdConnectResponse {Ошибка = OpenIdConnectConstants.Errors.InvalidGrant, ErrorDescription = "Электронная почта / пароль пара является недействительным."}); } = Вар роли ждут userManager.GetRolesAsync (пользователь); // подсчет ролей 3
Makla
2

голосов
2

ответ
195

Просмотры

Регистрация нескольких RedirectUris

Иногда клиент имеет более одного перенаправление URI. Мы хотим, чтобы иметь возможность зарегистрировать несколько значений RedirectUri. Как, если вообще, мы делаем это? context.Applications.Add (новый OpenIddictApplication {ClientID = "Zamboni-приложение", ClientSecret = Crypto.HashPassword ( "secret_secret_secret"), DisplayName = "Zamboni приложение", LogoutRedirectUri = «http://zamboni-app.azurewebsites.net/ SignOut-РСИН», RedirectUri = "http://zamboni-app.azurewebsites.net/signin-oidc", Тип = OpenIddictConstants.ClientTypes.Public});
Shaun Luttin
7

голосов
2

ответ
5.9k

Просмотры

How do you troubleshoot AspNet Core missing dependencies?

Так что я сделал изменения в мое project.json что вызвало повторное восстановление, которое приходит с кучей неразрешимых зависимостей. Как вы выяснить, что здесь происходит? Это, безусловно, работает, как я написал совсем немного кода против этого project.json файла. "зависимости": { "EntityFramework.Commands": "7.0.0- *", "Microsoft.AspNet.Authentication.Cookies": "1.0.0- *", "Microsoft.AspNet.Diagnostics.Entity": «7.0. 0- * " "Microsoft.AspNet.Identity.EntityFramework": "3.0.0- *", "Microsoft.AspNet.IISPlatformHandler": "1.0.0- *", "Microsoft.AspNet.Authentication.JwtBearer":" 1.0.0-rc2- * " "Microsoft.AspNet.Mvc": "6.0.0- *", "Microsoft.AspNet.Hosting":" 1,0.
jmorc

Просмотр дополнительных вопросов