Вот мой код, который переопределяет перенаправление, если оно не из пути запроса

аюсь написать приложение ASP.NET, которое использует гибридную схему аутентификации. Пользователь может сохранить хэш своего имени пользователя и пароля в хранилище UserStore или пройти аутентификацию через Azure Active Directory.

Я создал форму входа на фото. Имеет стандартUserName а такжеPassword входы, но также имеет кнопку «Войти через Active Directory».

Это хорошо работает.

Теперь о проблеме: домашняя страница приложения имеет[Authorize] приписывать.

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

Если пользователь не вошел в систему, я хочу, чтобы он перенаправил на страницуAccount/Login, позволяя пользователю выбрать метод аутентификации.

Как только я добавилIAppBuilder.UseOpenIdConnectAuthentication к настройке конвейера, он больше не перенаправляет на эту страницу. Вместо этого он идет прямо на страницу входа в Microsoft.

Как мне настроить его так, чтобы аутентификация OpenID была частью системы, но позволила мне указать, как выполнять перенаправления, когда пользователь не аутентифицирован?

Вот код, где я настроил конвейер:

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

Когда вы нажимаете «Вход в Active Directory», он отправляет сообщение в «Account / 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");
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос