2016-12-21 23 views
1

Я пытаюсь разработать доказательство концепции с использованием веб-сайта моей компании в качестве сервера авторизации OAuth, который будет использоваться Umbraco через OWIN/Katana. Вся сантехника OAuth работает очень хорошо, но Umbraco не превращает внешнюю идентичность в локальную идентичность. Вместо входа в бэкэнд Umbraco пользователь возвращается на страницу входа. Единственное изменение после завершения потока OAuth заключается в том, что Umbraco создал файл cookie UMB_EXTLOGIN, содержащий длинную зашифрованную строку.Как преобразовать внешний идентификатор OAuth в локальный идентификатор в Umbraco?

Если я использую локальную идентификацию напрямую (например, имя пользователя и пароль на странице входа в систему Umbraco), Umbraco создает 4 файла cookie: UMB_UCONTEXT, UMB_UPDCHK, XSRF-TOKEN и XSRF-V. Я предполагаю, что у меня отсутствует то, что преобразует внешнюю идентичность в локальную, но я не уверен, что это такое.

Startup.Auth.cs

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.ConfigureBackOfficeMyCompanyAuth(Properties.Settings.Default.ClientId, Properties.Settings.Default.ClientSecret); 
    } 
} 

UmbracoMyCompanyAuthExtensions.cs

public static class UmbracoMyCompanyAuthExtensions 
{ 
    public static void ConfigureBackOfficeMyCompanyAuth(this IAppBuilder app, string clientId, string clientSecret, 
     string caption = "My Company", string style = "btn-mycompany", string icon = "fa-rebel") 
    { 
     var options = new MyCompanyAuthenticationOptions 
     { 
      ClientId = clientId, 
      ClientSecret = clientSecret, 
      SignInAsAuthenticationType = Constants.Security.BackOfficeExternalAuthenticationType, 
      Provider = new MyCompanyAuthenticationProvider(), 
      CallbackPath = new PathString("/MyCompanySignIn") 
     }; 

     options.ForUmbracoBackOffice(style, icon); 
     options.Caption = caption; 
     app.UseMyCompanyAuthentication(options); 
    } 
} 

MyCompanyAuthenticationExtension.cs

public static class MyCompanyAuthenticationExtensions 
{ 
    public static IAppBuilder UseMyCompanyAuthentication(this IAppBuilder app, MyCompanyAuthenticationOptions options) 
    { 
     if (app == null) 
     { 
      throw new ArgumentNullException("app"); 
     } 
     if (options == null) 
     { 
      throw new ArgumentNullException("options"); 
     } 
     app.Use(typeof(MyCompanyAuthenticationMiddleware), new object[] { app, options }); 
     return app; 
    } 

    public static IAppBuilder UseMyCompanyAuthentication(this IAppBuilder app, string clientId, string clientSecret) 
    { 
     MyCompanyAuthenticationOptions options = new MyCompanyAuthenticationOptions 
     { 
      ClientId = clientId, 
      ClientSecret = clientSecret 
     }; 
     return app.UseMyCompanyAuthentication(options); 
    } 
} 

Моя пользовательская реализация AuthenticationHandler<T>.AuthenticateCoreAsync() возвращает AuthenticationTicket со следующими утверждениями и свойствами.

Иски

  1. GivenName = My First Name
  2. FamilyName = Моя Фамилия
  3. Name = полное имя
  4. Электронная почта = Мой адрес электронной почты

Свойства

  1. .redirect =/Umbraco/

ответ

0

не имеют никакого кода готового под рукой, но из прошлого опыта, используя Facebook OAuth, вы должны проволоки в своей собственной логике в основном один или оба, конвертировать вы OAuth объект (пользователь) в umbraco.

Когда мы сделали это раньше, когда пользователь впервые делает это (проверяя по электронной почте), он создает нового пользователя, а затем каждый последующий логин получает пользователя umbraco по электронной почте и записывает их в код. Это было то же самое для обоих бэкэнд-пользователей и передних членов.

0

Так что после большого поворота колес я наконец понял это. Полученная в результате ClaimsIdentity не содержала требование NameIdentifier. У меня было промежуточное ПО OAuth, включающее эту претензию, использующую адрес электронной почты в качестве значения, и она начала работать.

FYI, если вы хотите авторизовать внешние и локальные учетные записи при внешнем логине, here - это действительно хороший пример, который работал на меня.

 Смежные вопросы

  • Нет связанных вопросов^_^