如何检查是否为浏览器启用了cookie

时间:2010-09-15 10:22:35

标签: asp.net-mvc

如何在ASP.NET(MVC)中检查是否为浏览器启用了cookie

2 个答案:

答案 0 :(得分:11)

这是我的登录操作方法的授权过滤器:

/// <summary>
/// Ensures that cookies are enabled.
/// </summary>
/// <exception cref="CookiesNotEnabledException" />
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class EnsureCookiesAttribute : FilterAttribute, IAuthorizationFilter
{
    private readonly string _cookieName;
    private readonly bool _specificCookie;

    /// <summary>
    /// The name of the cookie to use to ensure cookies are enabled.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible",
        Justification = "Field is public so that the default value may be modified.")]
    public static string DefaultCookieName = "SupportsCookies";

    public const string CookieCheck = "cookieCheck";

    /// <summary>
    /// Checks to make sure cookies are generally enabled.
    /// </summary>
    public EnsureCookiesAttribute() : this(null) { }

    /// <summary>
    /// Checks to make sure a cookie with the given name exists
    /// </summary>
    /// <param name="cookieName">The name of the cookie</param>
    public EnsureCookiesAttribute(string cookieName)
    {
        if (String.IsNullOrEmpty(cookieName))
        {
            cookieName = DefaultCookieName;
        }
        else
        {
            _specificCookie = true;

        }

        QueryString = CookieCheck;

        _cookieName = cookieName;
    }

    /// <summary>
    /// The name of the cookie to check for.
    /// </summary>
    public string CookieName
    {
        get { return _cookieName; }
    }

    /// <summary>
    /// The querystring parameter to use to see if a test cookie has been set.
    /// </summary>
    public string QueryString { get; set; }

    protected static CookiesNotEnabledException CreateBrowserException()
    {
        return new CookiesNotEnabledException("Your browser does not support cookies.");
    }

    protected static CookiesNotEnabledException CreateNotEnabledException()
    {
        return new CookiesNotEnabledException("You do not have cookies enabled.");
    }

    #region Implementation of IAuthorizationFilter

    /// <summary>
    /// Called when authorization is required.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes"
        , Justification = "Should swallow exceptions if a cookie can't be set.  This is the purpose of the filter.")]
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
            throw new ArgumentNullException("filterContext");

        var request = filterContext.HttpContext.Request;
        var response = filterContext.HttpContext.Response;

        if (!request.Browser.Cookies)
            throw CreateBrowserException();

        string currentUrl = request.RawUrl;

        var noCookie = (request.Cookies[CookieName] == null);
        if (!_specificCookie && noCookie && request.QueryString[QueryString] == null)
        {
            try
            {
                // make it expire a long time from now, that way there's no need for redirects in the future if it already exists
                var c = new HttpCookie(CookieName, "true") {Expires = DateTime.Today.AddYears(50)};
                response.Cookies.Add(c);

                currentUrl = currentUrl + (currentUrl.Contains('?') ? "&" : "?") + QueryString + "=true";

                filterContext.Result = new RedirectResult(currentUrl);
                return;
            }
            catch
            {
            }
        }

        if (noCookie)
            throw CreateNotEnabledException();
    }

    #endregion
}

/// <summary>
/// Thrown when cookies are not supported.
/// </summary>
[Serializable]
public class CookiesNotEnabledException : HttpException
{
    public CookiesNotEnabledException()
    {
    }

    protected CookiesNotEnabledException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }

    public CookiesNotEnabledException(string message)
        : base(message)
    {
    }

    public CookiesNotEnabledException(string message, Exception innerException)
        : base(message, innerException)
    {
    }
}

您可以使用它来确保将Cookie启用为

[EnsureCookies]
[HandleError(ExceptionType = typeof(CookiesNotEnabledException), View="NoCookies")]
public ActionResult LogOn(....) ...

或确保为某项操作设置了特定的Cookie

[EnsureCookies("MyCookie")]
[HandleError(ExceptionType = typeof(CookiesNotEnabledException), View="Some cookie not set view"]
public ActionResult ActionThatNeedsMyCookie()....

我不确定你为什么需要这样做,但确实如此。希望它有所帮助。

答案 1 :(得分:0)

我是怎么做到的:

在登录期间创建一个特殊的cookie,在URL中添加?cookiecheck = true,并在URL中看到cookiecheck后,检查是否存在用于检查的特殊cookie。如果没有,cookie被禁用。