asp.net-mvc – HttpContext中需要什么来允许FormsAuthentication.SignOut()执行?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – HttpContext中需要什么来允许FormsAuthentication.SignOut()执行?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为我们的注销方法写一个单元测试.其中包括FormsAuthentication.SignOut().但是,它会抛出一个System.NullReferenceException.

我创造了一个模拟; HttpContext(使用Moq),但它显然是丢失的东西.

我的模拟环境包含:

>一个嘲笑的HttpRequestBase请求
>一个嘲笑响应的HttpResponseBase
>在Request.Cookies上使用HttpCookieCollection,在Response.Cookies上使用另一个
>一个嘲笑用户的IPrincipal

我知道我可以去包装路线,并在它的地方注入一个空的FormsAuth包装器对象,但我真的希望避免3个额外的文件只是为了修复一行代码.那我还是好奇的答案

所以我的问题是“HttpContext允许FormsAuthentication.SignOut()执行需要什么.”

解决方法

以下是注销代码.
public static void SignOut()
{
    Initialize();
    HttpContext current = HttpContext.Current;
    bool flag = current.CookielessHelper.DoesCookieValueExistInOriginal('F');
    current.CookielessHelper.SetCookieValue('F',null);
    if (!CookielessHelperClass.UseCookieless(current,false,CookieMode) || current.Request.Browser.Cookies)
    {
        string str = string.Empty;
        if (current.Request.Browser["supportsEmptyStringInCookieValue"] == "false")
        {
            str = "NoCookie";
        }
        HttpCookie cookie = new HttpCookie(FormsCookieName,str);
        cookie.HttpOnly = true;
        cookie.Path = _FormsCookiePath;
        cookie.Expires = new DateTime(0x7cf,10,12);
        cookie.Secure = _RequireSSL;
        if (_CookieDomain != null)
        {
            cookie.Domain = _CookieDomain;
        }
        current.Response.Cookies.RemoveCookie(FormsCookieName);
        current.Response.Cookies.Add(cookie);
    }
    if (flag)
    {
        current.Response.Redirect(GetLoginPage(null),false);
    }
}

看起来你需要一个CookielessHelperClass实例.太糟糕了,它是内部和密封的 – 除非你使用TypeMock,否则没有办法模拟它. 1为包装建议:)

猜你在找的asp.Net相关文章