Ho colpito questo per ore e sono perplesso. Sto effettuando una richiesta di posta ajax su un controller MVC 5 nel tentativo di accedere automaticamente a uno specifico utente "super" predefinito. Nel metodo controller, sto provando a impostare HttpContext.Current.User al livello di programmazione e autenticarlo, in modo che l'utente super possa ignorare il processo di accesso manuale. Il consenso su questo sembra essere qui, che ho implementato:.net Autenticazione moduli - impostazione manuale HttpContext.Current.User non funziona in personalizzato AuthorizeAttribute
setting HttpContext.Current.User
Questo sembra funzionare finché non provo a visualizzare altri metodi di controller con un AuthorizeAttribute personalizzato. Metodo
Controller:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(string username)
{
string password = ConfigurationManager.AppSettings["Pass"];
User user = service.Login(username, password);
var name = FormsAuthentication.FormsCookieName;
var cookie = Response.Cookies[name];
if (cookie != null)
{
var ticket = FormsAuthentication.Decrypt(cookie.Value);
if (ticket != null && !ticket.Expired)
{
string[] roles = (ticket.UserData as string ?? "").Split(',');
System.Web.HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket), roles);
}
}
//...processing result
return Json(result);
}
Il metodo service.Login precedente crea il cookie:
FormsAuthentication.SetAuthCookie(cookieValue, false);
se sto Impostazioni dell'utente, che ha un'identità e IsAuthenticated è vero, il filterContext .HttpContext.User di seguito non è lo stesso utente. È essenzialmente vuoto come se non fosse mai stato assegnato e non sia autenticato.
public override void OnAuthorization(AuthorizationContext filterContext)
{
string[] userDetails = filterContext.HttpContext.User.Identity.Name.Split(char.Parse("|"));
}
Il post più vicina che ho trovato è qui: IsAuthenticated works on browser - but not with Air client!
Tuttavia, la correzione per che era già in atto per me:
<authentication mode="Forms">
<forms cookieless="UseCookies" timeout="60" loginUrl="~/Account/Login" />
</authentication>
Che cosa mi manca per fare l'AuthorizationContext. L'utente corrisponde a HttpContext.Current.User che sto autenticando nel controller?
UPDATE:
mi rendo conto che ho bisogno di un reindirizzamento per impostare correttamente il cookie, solo che non sono in grado di fare quel lavoro da remoto, tramite una chiamata AJAX. Ecco come appare lo script nel sito A, quando si esegue il metodo del controller sul sito B. Questo reindirizzamento non imposta la sessione. Non è ancora presente quando si autentica l'utente sul prossimo metodo del controller. Mi ha appena reindirizzato alla vista di accesso.
function remoteLogin(id) {
$.ajax({
url: "/MyController/RemoteLogin",
type: "POST",
dataType: "json",
data: { "id": id }
}).done(function (data) {
if (data) {
if (data.user) {
var user = data.user;
$.ajax({
url: "http://siteB.xyz/Account/Login",
type: "POST",
dataType: "json",
data: { "username": user.username, "password": user.password }
}).done(function (data) {
if (data) {
window.location.href = "http://siteB.xyz/Next"
} else {
alert("Fail.");
}
}).fail(function (data) {
alert("Fail.");
});
} else {
alert("Fail.");
}
}
}).fail(function (data) {
alert("Fail.");
});
}
Questo è quello che mi sono trovato, guardandomi intorno: quello che sto cercando è un modo per farlo nel contesto di ciò che sto tentando: un accesso remoto. Ad esempio, l'impostazione "location.href" in caso di successo, nel mio script, non fa alcuna differenza. Ho bisogno di un modo per fare ciò che stai descrivendo, da remoto, attraverso una chiamata ajax. –
Confermato! Quello che ho fatto (ed è discutibile-sicuro), è scrivere un cookie con il nome utente/password sul lato App A, quindi aprire una nuova finestra dallo script, in caso di successo della chiamata ajax. Nell'App B, leggo e distruggo il cookie temporaneo, eseguo il login, quindi reindirizzo alla vista autenticata. Sembra tutto funzionare. Aggiornerà il mio OP con i dettagli, in seguito. –