Однако мне не нужны никакие другие методы авторизации, кроме OpenIDConnect.Мне нужно, чтобы неавторизованный пользователь был немедленно перенаправлен на удаленный сервер авторизации.
Как я могу предотвратить другие способы входа и перенаправить напрямую на сервер авторизации, но не на страницу входа ASP.NET?
Действительно, есть способ перенаправить на сервер авторизации напрямую, не обращаясь к какой-либо локальной странице входа.
Но обычно нам все еще нужен еще SignInScheme
. Если вы посмотрите на исходный код, вы обнаружите, что, когда обработчику удаленной аутентификации удастся аутентифицировать какого-либо пользователя, он подпишет пользователя в:
// ...
await Context.SignInAsync(SignInScheme, ticketContext.Principal, ticketContext.Properties);
// ...
Например, если аутентификация OAuth2.0
прошла успешно, мы должны установить файл cookie или выдать токен JWT для текущего пользователя.
Что касается вашего вопроса, самый простой способ - зарегистрировать схему cookie в Challenge / Signin:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect("MyOIDC", options =>
{
// ...
}
И теперь вы можете использовать [Authorize]
по своему усмотрению.Приведенный выше код работает без нареканий для меня без ASP.NET Core Identity
[Update] : Извините, я забыл упомянуть, что мы должны настроить процесс вызова:
- Подход 1: настроить схему прямого вызова для Cookie:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>{
options.ForwardChallenge ="MyOIDC";
})
.AddOpenIdConnect("MyOIDC", options =>
{
// ....
}
Подход 2: вызвать схему вызова вручную:
public class AccountController : Controller
{
public async Task Login(string returnUrl = "/")
{
await HttpContext.ChallengeAsync("MyOIDC", new AuthenticationProperties() { RedirectUri = returnUrl });
}
// if you need sign out the MyOIDC service, you could sign out the user for two schemes as below :
[Authorize]
public async Task Logout()
{
await HttpContext.SignOutAsync("MyOIDC", new AuthenticationProperties
{
RedirectUri = Url.Action("Index", "Home")
});
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}