Я бил это один в течение нескольких часов, и я в тупике. Я делаю запрос на отправку ajax контроллеру MVC 5, пытаясь автоматически войти в систему с определенным предопределенным "супер" пользователем. В методе контроллера я пытаюсь программно установить HttpContext.Current.User и аутентифицироваться, поэтому суперпользователь может пропустить процесс ручного входа в систему. Консенсус по этому вопросу, похоже, здесь, который я реализовал:
настройка HttpContext.Current.User
Кажется, что это работает, пока я не попытаюсь просмотреть любые другие методы контроллера с помощью специального атрибута AuthorizeAttribute.
Метод контроллера:
[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);
}
Метод service.Login выше создает файл cookie:
FormsAuthentication.SetAuthCookie(cookieValue, false);
Хотя я устанавливаю User, у которого есть Identity и IsAuthenticated, верно, filterContext.HttpContext.User ниже - это не тот же пользователь. Он по существу пуст, как будто он никогда не был назначен и не аутентифицирован.
public override void OnAuthorization(AuthorizationContext filterContext)
{
string[] userDetails = filterContext.HttpContext.User.Identity.Name.Split(char.Parse("|"));
}
Ближайший пост, который я мог найти, находится здесь: IsAuthenticated работает в браузере - но не с клиентом Air!
Однако исправление для этого уже было для меня:
<authentication mode="Forms">
<forms cookieless="UseCookies" timeout="60" loginUrl="~/Account/Login" />
</authentication>
Что мне не хватает, чтобы заставить AuthorizationContext.User соответствовать HttpContext.Current.User, который я аутентифицирую в контроллере?
UPDATE:
Я понимаю, что мне нужно перенаправить, чтобы настроить cookie правильно, я просто не могу сделать эту работу удаленно, используя вызов ajax. Вот что выглядит script на сайте A при выполнении метода контроллера на сайте B. Это перенаправление не устанавливает сеанс. Этого еще нет при аутентификации пользователя по следующему методу контроллера. Он просто перенаправляет меня обратно в окно входа.
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.");
});
}