2015-10-27 3 views
2

Я пытаюсь использовать поток аутентификации администратора Orchard и вместо этого заменять его OpenId Connect с использованием Azure AD (для целей единого входа). После того, как пользователь будет аутентифицирован с помощью OpenId, я хочу затем подписать пользователя в Orchard, чтобы использовать роли Orchard для авторизации.OpenId Connect Owin Middleware с Orchard CMS 1.9.2

Это код, который я до сих пор

OwinMiddlewareProvider:

public class OpenIdConnectMiddleware : IOwinMiddlewareProvider 
{ 
    public IEnumerable<OwinMiddlewareRegistration> GetOwinMiddlewares() 
    { 
     return new[] 
     { 
      new OwinMiddlewareRegistration 
      { 
       Priority = "1", 

       Configure = app => { 
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

        app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

        app.UseOpenIdConnectAuthentication(
         new OpenIdConnectAuthenticationOptions 
         { 
          ClientId = "<My Client Id>", 
          Authority = "<My Authority>", 
          RedirectUri = "https://localhost:44357/" 
         }); 
       } 
      } 
     }; 
    } 
} 

Мой маршрут для захвата доступа по умолчанию отказано по маршруту:

new RouteDescriptor { 
    Priority = 1, 
    Route = new Route(
     "Users/Account/AccessDenied", 
     new RouteValueDictionary { 
           {"area", "BCS.Authentication"}, 
           {"controller", "Account"}, 
           {"action", "LogOn"} 
     }, 
     new RouteValueDictionary(), 
     new RouteValueDictionary { 
           {"area", "BCS.Authentication"} 
     }, 
     new MvcRouteHandler()) 
    } 

И, наконец, моя AccountController имеет следующие:

public ActionResult LogOn(string returnUrl) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     HttpContext.GetOwinContext().Authentication.Challenge(
      new AuthenticationProperties { RedirectUri = string.IsNullOrEmpty(returnUrl) ? "/" : returnUrl }, 
      OpenIdConnectAuthenticationDefaults.AuthenticationType); 

     return new EmptyResult(); 
    } 

    var currentUser = _authenticationService.GetAuthenticatedUser(); 

    if (currentUser == null) 
    { 
     // temporary, just for testing purposes 
     var user = _membershipService.GetUser("douwinga"); 
     _authenticationService.SignIn(user, false); 
    } 

    return new RedirectResult(returnUrl); 
} 

С помощью этого кода при переходе на https://localhost:44357/admin Request.IsAuthenticated является ложным, поэтому он переводит меня на страницу входа в ADFS. После входа в систему я вернусь к действию LogOn, и Request.IsAuthenticated теперь верен. Затем он пытается использовать службу authenticationService, чтобы проверить, не аутентифицирован ли я с Orchard и, очевидно, возвращает null, поэтому он подписывает меня в Orchard. Если я проверю проверку подлинности, чтобы проверить, не был ли я зарегистрирован после входа в систему, он возвращает моего пользователя, так что я аутентифицирован с помощью Orchard на этом этапе.

Затем возникает вопрос. Я перенаправлен в/admin сейчас, когда я аутентифицирован, и он выполняет другую проверку подлинности, поэтому я возвращаюсь к действию LogOn моего контроллера. На этот раз Request.IsAuthenticated по-прежнему верен, но currentUser по-прежнему имеет значение null, поэтому я больше не аутентифицирован с помощью Orchard, поэтому он снова пытается войти в Orchard. Тогда это ставит меня в петлю.

Есть что-то, что мне не хватает? Есть ли лучший подход?

ответ

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