微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net表单验证 – 手动设置HttpContext.Current.User在自定义AuthorizeAttribute中不起作用

我已经打了几个小时,我被困了.我正在向MVC 5控制器发出一个ajax发布请求,试图自动登录一个特定的预定义的“超级”用户.在控制器方法中,我试图通过编程方式设置HttpContext.Current.User并进行身份验证,所以超级用户可以跳过手动登录的过程.这个共识似乎在这里,我实现了:

setting 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);

虽然我设置了具有Identity和IsAuthenticated的用户,但下面的filterContext.HttpContext.User不是同一个用户.它基本上是空的,好像它从未被分配,并且没有被认证.

public override void OnAuthorization(AuthorizationContext filterContext) 
{
    string[] userDetails = filterContext.HttpContext.User.Identity.Name.Split(char.Parse("|"));
}

我找到的最近的帖子是:IsAuthenticated works on browser – but not with Air client!

但是,针对我的修复已经到位了:

<authentication mode="Forms">
  <forms cookieless="UseCookies" timeout="60" loginUrl="~/Account/Login" />
</authentication>

我使我的AuthorizationContext.User与我在控制器中验证的HttpContext.Current.User相匹配?

更新:

我意识到我需要一个重定向来正确设置cookie,我只是不能通过ajax调用远程完成该工作.在站点B上执行控制器方法时,站点A中的脚本是什么样的.此重定向不会设置会话.在下一个控制器方法上验证用户时仍然不存在.它只是将我重定向登录视图.

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

解决方法

您所遇到的问题是,您只需设置身份验证cookie,在发出新请求之前,不会发生在表单身份验证模块中创建的IPrincipal,因此HttpContext.User处于异常状态.一旦重定向发生,那么因为它是一个来自浏览器的新请求,所以在您的页面到达之前,cookie将被读取,并创建正确的用户对象.

Cookie只有在请求完成后才能在浏览器中设置.

原文地址:https://www.jb51.cc/html/229544.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐