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