ASP.NET con OpenIdAuthentication: redirigir a url si no está autorizado

Estoy intentando escribir una aplicación ASP.NET que utiliza un esquema de autenticación híbrido. Un usuario puede tener su hash de nombre de usuario y contraseña almacenado en el UserStore, o puede autenticarse a través de Azure Active Directory.

He creado el formulario de inicio de sesión en la foto. Tiene el estándarUserName yPassword entradas, pero también tiene un botón "Iniciar sesión a través de Active Directory".

Esto funciona bien

Ahora para el problema: la página de inicio de la aplicación tiene el[Authorize] atributo.

public class DefaultController : Controller
{
    [Authorize]
    public ViewResult Index()
    { 
    // Implementation
    }
}

Si el usuario no ha iniciado sesión, quiero que redirija a la páginaAccount/Login, permitiendo al usuario elegir el método de autenticación.

Una vez que agreguéIAppBuilder.UseOpenIdConnectAuthentication a la configuración de canalización, ya no se redirige a esa página. En cambio, va directamente a la página de inicio de sesión de Microsoft.

¿Cómo lo configuro para que la autenticación OpenID sea parte del sistema, pero me permite especificar cómo realizar redirecciones cuando el usuario no está autenticado?

Aquí está el código donde configuré la tubería:

appBuilder.SetDefaultSignInAsAuthticationType(CookieAuthenticationDefaults.AuthenticationType_;
var cookieAuthenticationOptions = new CookieAuthenticationOptions
{
     AuthenticationType = DefaultAuthenticationType.ApplicationCookie,
     LoginPath = new Microsoft.Owin.PathString("/Account/Login"),
     Provider = new Security.CookieAuthenticationProvider()
};
appBuilder.UseCookieAuthentication(cookieAuthenticationOptions);
// Now the OpenId authentication
var notificationHandlers = new OpenIdConnectAuthenticationNotificationHandlers 
{
   AuthorizationCodeReceived = async(context) => {
       var jwtSecurityToken = context.JwtSecurityToken;
       // I've written a static method to convert the claims
       // to a user
       var user = await GetOrCreateUser(context.OwinContext, jwtSecurityToken.Claims);
       var signInManager = context.OwinContext.Get<SignInManager>();
       await signInManager.SignInAsync(user, true, false);
   }
}
var openIdOptions = new OpenIdConnectAuthenticationOptions
{
     ClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
     Authority = "https://login.microsoftonline.com/xxxxx.onmicrosoft.com",
     PostLogoutRedirectUri = "https://localhost:52538/Account/Login",
     Notifications = notifcationHandlers
}
appBuilder.UseOpenIdConnectAuthentication(openIdOptions);

Cuando hace clic en "Inicio de sesión de Active Directory", se publica en "Cuenta / Iniciar sesión con OpenId"

public ActionResult SignInWithOpenId()
{
    // Send an OpenID Connect sign-in request.
    if (!Request.IsAuthenticated)
    {
        var authenticationProperties = new AuthenticationProperties
        {
            RedirectUri = "/"
        };
        HttpContext.GetOwinContext().Authentication.Challenge
        (
            authenticationProperties,
            OpenIdConnectAuthenticationDefaults.AuthenticationType
        );
        return new EmptyResult();
    }
    else
    {
        return RedirectToAction("Index", "Default");
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta