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

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

概述我已经打了几个小时,我被困了.我正在向MVC 5控制器发出一个ajax发布请求,试图自动登录一个特定的预定义的“超级”用户.在控制器方法中,我试图通过编程方式设置HttpContext.Current.User并进行身份验证,所以超级用户可以跳过手动登录的过程.这个共识似乎在这里,我实现了: setting HttpContext.Current.User 这似乎有效,直到我尝试使用自定义Auth 我已经打了几个小时,我被困了.我正在向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只有在请求完成后才能在浏览器中设置.

总结

以上是内存溢出为你收集整理的.net表单验证 – 手动设置HttpContext.Current.User在自定义AuthorizeAttribute中不起作用全部内容,希望文章能够帮你解决.net表单验证 – 手动设置HttpContext.Current.User在自定义AuthorizeAttribute中不起作用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1093648.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存