Я пытаюсь использовать поток аутентификации администратора 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. Тогда это ставит меня в петлю.
Есть что-то, что мне не хватает? Есть ли лучший подход?