ASP.NET com OpenIdAuthentication: redirecione para url se não estiver autorizado

Estou tentando escrever um aplicativo ASP.NET que usa um esquema de autenticação híbrida. Um usuário pode ter seu hash de nome de usuário e senha armazenados na UserStore ou pode se autenticar via Azure Active Directory.

Eu criei o formulário de login na foto. Tem o padrãoUserName ePassword entradas, mas também possui um botão "Login via Active Directory".

Isso funciona bem.

Agora, o problema: a página inicial do aplicativo possui o[Authorize] atributo.

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

Se o usuário não estiver logado, quero que ele seja redirecionado para a páginaAccount/Login, permitindo que o usuário escolha o método de autenticação.

Depois que adicioneiIAppBuilder.UseOpenIdConnectAuthentication para a configuração do pipeline, ele não redireciona mais para essa página. Em vez disso, vai diretamente para a página de logon da Microsoft.

Como o configuro para que a autenticação OpenID faça parte do sistema, mas permita-me especificar como executar redirecionamentos quando o usuário não está autenticado?

Aqui está o código em que eu configurei o pipeline:

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);

Quando você clica em "Login do Active Directory", ele é postado em "Conta / SignInWithOpenId"

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");
    }
}

questionAnswers(2)

yourAnswerToTheQuestion