Ich habe diese seit Stunden geschlagen und ich bin ratlos. Ich mache eine Ajax-Post-Anfrage an einen MVC 5-Controller, um einen bestimmten vordefinierten "Super" -Benutzer automatisch einzuloggen. In der Controller-Methode versuche ich, den HttpContext.Current.User programmatisch zu setzen und authentifizieren, so dass der Super-Benutzer den Prozess der manuellen Anmeldung überspringen kann. Der Konsens darüber scheint hier zu sein, die ich implementiert habe:.net Formularauthentifizierung - manuelle Einstellung von HttpContext.Current.User funktioniert nicht in benutzerdefinierten AuthorizeAttribute
setting HttpContext.Current.User
Dies scheint zu funktionieren, bis ich versuche, andere Controller-Methoden mit einem benutzerdefinierten AuthorizeAttribute anzuzeigen.
Controller-Methode:
[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);
}
Die service.Login Methode über das Cookie erstellt:
FormsAuthentication.SetAuthCookie(cookieValue, false);
Obwohl ich die Einstellung der Benutzer, die eine Identität hat und IsAuthenticated ist wahr, die filterContext .HttpContext.User ist nicht derselbe Benutzer. Es ist im Wesentlichen leer, als ob es nie zugewiesen wurde und nicht authentifiziert ist.
public override void OnAuthorization(AuthorizationContext filterContext)
{
string[] userDetails = filterContext.HttpContext.User.Identity.Name.Split(char.Parse("|"));
}
Die nächstgelegene Post ich finden konnte ist hier: IsAuthenticated works on browser - but not with Air client!
jedoch das Update für das war bereits für mich:
<authentication mode="Forms">
<forms cookieless="UseCookies" timeout="60" loginUrl="~/Account/Login" />
</authentication>
Was ich die AuthorizationContext machen bin fehlt. Benutzer stimmen die HttpContext.Current.User, die ich im Controller authentifizieren?
UPDATE:
Ich weiß, ich brauche eine Umleitung des Cookies richtig zu setzen, ich bin in der Lage einfach nicht, dass die Arbeit der Ferne zu machen, über einen Ajax-Aufruf. So sieht das Skript in Site A aus, wenn die Controller-Methode auf Site B ausgeführt wird. Diese Weiterleitung legt die Sitzung nicht fest. Es ist immer noch nicht vorhanden, wenn der Benutzer bei der nächsten Controller-Methode authentifiziert wird. Es leitet mich nur zurück zur Login-Ansicht.
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.");
});
}
Das ist, was ich selbst gefunden habe, schau mich um - was ich suche ist eine Möglichkeit, dies im Zusammenhang mit dem zu tun, was ich versuche - ein Remote-Login. Zum Beispiel macht das Setzen des "location.href" beim Erfolg in meinem Skript keinen Unterschied. Ich brauche einen Weg, um das zu tun, was du im Entferntesten durch einen Ajax-Anruf beschreibst. –
Bestätigt! Was ich getan habe (und es ist fraglich sicher), ist ein Cookie mit dem Benutzernamen/Passwort auf der Seite von App A zu schreiben und dann ein neues Fenster aus dem Skript zu öffnen, wenn der Ajax-Anruf erfolgreich war. In App B lese und zerstöre ich das temporäre Cookie, führe die Anmeldung durch und leite dann zur authentifizierten Ansicht um. Es scheint alles zu funktionieren. Wird später mein OP mit Details aktualisieren. –