Вот мой код, который переопределяет перенаправление, если оно не из пути запроса
аюсь написать приложение 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");
}
}