asp.net-mvc - 如何检查浏览器是否启用cookie

标签 asp.net-mvc

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

最佳答案

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

/// <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()....

我不知道为什么你需要这样做,但就是这样。希望它有帮助。

关于asp.net-mvc - 如何检查浏览器是否启用cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716710/

相关文章:

asp.net-mvc - 为什么 HttpContext.Request.Url 与地址栏中的内容不匹配?

c# - 是否可以使用 c# 类创建此 JSON 格式?

asp.net-mvc - 在 HtmlHelper 扩展方法期间正在执行哪个操作

asp.net-mvc - MVC 属性路由 Url.Action 无法解析路由

c# - 如何在 ASP.NET Core 中使用 npm

c# - 如何从不在默认 DBO 架构中的 SQL Server 数据库表中读取数据

asp.net-mvc - Web API可为空的必需属性需要DataMember属性

javascript - 提前输入和 Taginput : Issue with Remote Fetch

c# - 同一 View 中的多个模型?

带有自定义参数的 Html.DropDownListFor()