Asp.net 当不使用FormsAuthentication.RedirectFromLoginPage时,如何将Request.IsAuthenticated设置为true?

Asp.net 当不使用FormsAuthentication.RedirectFromLoginPage时,如何将Request.IsAuthenticated设置为true?,asp.net,ajax,json,authentication,asp.net-membership,Asp.net,Ajax,Json,Authentication,Asp.net Membership,我正在使用表单身份验证并向服务器发送Aajx请求以进行身份验证。根据json结果,客户机决定去哪里以及做什么。这就是我不使用FormsAuthentication.RedirectFromLoginPage来不干扰ajax/json响应的原因 在这种情况下,Request.IsAuthenticated返回false,即使在使用Membership.ValidateUser验证用户之后也是如此。然后我使用 FormsAuthentication.SetAuthCookie(username, f

我正在使用表单身份验证并向服务器发送Aajx请求以进行身份验证。根据json结果,客户机决定去哪里以及做什么。这就是我不使用FormsAuthentication.RedirectFromLoginPage来不干扰ajax/json响应的原因

在这种情况下,Request.IsAuthenticated返回false,即使在使用Membership.ValidateUser验证用户之后也是如此。然后我使用

FormsAuthentication.SetAuthCookie(username, false);
尽管第二个参数persistent cookie为false,但cookie在浏览器会话中仍然有效


知道如何使Request.IsAuthenticated在不使用FormsAuthentication.RedirectFromLoginPage的情况下工作吗?

您需要更新请求的当前安全主体。当您调用
响应时。重定向(…)
完成新请求,重新初始化安全主体,request.IsAuthenticated在您的情况下返回true
FormsAuthentication.RedirectFromLoginPage
内部调用
响应。重定向(…)
。您可以手动续订当前请求的安全主体,如下所示:

public void RenewCurrentUser()
{
    System.Web.HttpCookie authCookie =
        System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
        FormsAuthenticationTicket authTicket = null;
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);

        if (authTicket != null && !authTicket.Expired)
        {
            FormsAuthenticationTicket newAuthTicket = authTicket;

            if (FormsAuthentication.SlidingExpiration)
            {
                newAuthTicket = FormsAuthentication.RenewTicketIfOld(authTicket);
            }
            string userData = newAuthTicket.UserData;
            string[] roles = userData.Split(',');

            System.Web.HttpContext.Current.User =
                new System.Security.Principal.GenericPrincipal(new FormsIdentity(newAuthTicket), roles);
        }
    }
}
FormsAuthentication.SetAuthCookie

方法创建身份验证 提供的用户名和密码的票证 将其添加到的cookies集合 响应或URL(如果需要) 使用无cookieless身份验证

参考:

看一看这张照片。身份验证cookie被设置为响应cookie集合,并且应该在http协议级别上可见(例如,使用FireCookie或Fiddler2来验证)

成员资格仅验证用户名/密码。成员身份和
SetAuthCookie()
都不会修改当前请求。他们希望将cookie发送回调用方,下一个请求是当
IsAuthenticated
等属性返回true时

请注意,您可以使用自定义
IIdentity
IPrincipal
覆盖和扩展这些自动过程,并在需要时连接到身份验证事件


另外,请看一看帖子后重定向是最佳做法,应该被视为正确的解决方案

在某些情况下,您可能仍然希望了解用户是否在身份验证请求的范围内进行了身份验证(例如,如果您在执行身份验证后正在运行与其他请求共享的附加逻辑)

在这种情况下,可以使用以下代码重置Request.IsAuthenticated的值:

// set the forms auth cookie
FormsAuthentication.SetAuthCookie(username, createPersistentCookie);

// reset request.isauthenticated
var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    if (authTicket != null && !authTicket.Expired)
    {
        var roles = authTicket.UserData.Split(',');
        System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
    }
 }
请参阅此处的帖子:

我们可以简单地使用它


FormsAuthentication.SetAuthCookie(用户名,true)

您可能没有使用AJAX请求正确设置cookie…您是否尝试按照msdn的说明进行操作?如果您试图在AJAX身份验证请求(即SPA)中生成并返回防伪令牌,则这一问题尤其严重。Asp.Net将为“”用户生成令牌,因为它假定当前没有人经过身份验证。不需要手动续订(特别是对于GenericPrincipal和FormSidenty),并且凭据不应在请求过程中部分更改,这就是为什么将cookie添加到响应中,然后执行一个全新的响应/请求生命周期的原因。在下一个请求中,将获取由FormsAuthentication.SetAuthCookie()创建的cookie。当然,此方法可以被视为黑客攻击,因为它不遵循正常的表单身份验证流程。但是,如果您想检查用户是否在身份验证参与的同一请求中进行了身份验证,它可能会很有用。有时,尽管黑客是您所需要的-我试图以“正确的方式”执行操作并强制重定向,并在其他系统被重定向时进入正确的状态:(感谢+Branislav Abadjimarinov这非常有帮助我用这段代码编写了一个名为AjaxRenewalPrincipal()的控制器扩展,对同一请求进行身份验证非常有效!谢谢!我使用Fiddler查看请求和响应中的cookie