• (MVC)验证用户是否登录


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace CommonHelper
    {
        [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
        public class AuthorizationAttribute
        {
            private String _AuthUrl = String.Empty;
    
            /// <summary>
            /// 获取或者设置一个值,改值表示登录地址
            /// 如果web.config中未定义AuthUrl的值,则默认为login
            /// </summary>
            public String AuthUrl
            {
                get { return _AuthUrl; }
                set
                {
                    if (String.IsNullOrEmpty(value))
                        throw new ArgumentNullException("用于验证用户登录信息的登录地址不能为空");
                    else
                        _AuthUrl = value.Trim();
                }
            }
    
            private String _AuthSaveKey = String.Empty;
            /// <summary>
            /// 获取或者设置一个值,改值表示登录用来保存登录信息的键名
            /// 如果web.config中未定义AuthSaveKey的值,则默认为LoginedUser
            /// </summary>
            public String AuthSaveKey
            {
                get { return _AuthSaveKey; }
                set {
                    if (String.IsNullOrEmpty(value))
                        throw new ArgumentNullException("用于保存登录信息的键名不能为空");
                    else
                        this._AuthSaveKey = value.Trim();
                }
            }
    
            private String _AuthSaveType = String.Empty;
            /// <summary>
            /// 获取或者设置一个值,该值表示用来保存登录信息的方式
            /// </summary>
            public String AuthSaveType {
                get { return _AuthSaveType; }
                set {
                    if (String.IsNullOrEmpty(value))
                        throw new ArgumentNullException("用于保存登录信息的方式不能为空,只能为【cookie】或者【session】");
                    else
                        this._AuthSaveType = value.Trim();
                }
            }
    
            /// <summary>
            /// 默认构造函数
            /// </summary>
            public AuthorizationAttribute()
            { 
                String authUrl=System.Configuration.ConfigurationManager.AppSettings["AuthUrl"];
                String saveKey = System.Configuration.ConfigurationManager.AppSettings["AuthSaveKey"];
                String saceType = System.Configuration.ConfigurationManager.AppSettings["AuthSaveType"];
    
                if (String.IsNullOrEmpty(authUrl))
                    this._AuthUrl = "/User/Login";
                else
                    this._AuthUrl = authUrl;
    
                if (String.IsNullOrEmpty(saveKey))
                    this._AuthSaveKey = "LoginedUser";
                else
                    this._AuthSaveKey = saveKey;
    
                if (String.IsNullOrEmpty(saceType))
                    this._AuthSaveType = "Session";
                else
                    this._AuthSaveType = saceType;
            }
    
            /// <summary>
            /// 构造函数重载
            /// </summary>
            /// <param name="authUrl">表示没有登录跳转的登录地址</param>
            public AuthorizationAttribute(String authUrl)
                : this()
            {
                this._AuthUrl = authUrl;
            }
    
            /// <summary>
            /// 构造函数重载
            /// </summary>
            /// <param name="authUrl">表示没有登录跳转的登录地址</param>
            /// <param name="saveKey">表示登录用来保存登录信息的键名</param>
            public AuthorizationAttribute(String authUrl, String saveKey)
                : this(authUrl)
            {
                this._AuthSaveKey = saveKey;
                this._AuthSaveType = "Session";
            }
    
            /// <summary>
            /// 构造函数重载
            /// </summary>
            /// <param name="authUrl">表示没有登录跳转的登录地址</param>
            /// <param name="saveKey">表示登录用来保存登录信息的键名</param>
            /// <param name="saveType">表示登录用来保存登录信息的方式</param>
            public AuthorizationAttribute(String authUrl, String saveKey, String saveType)
                : this(authUrl, saveKey)
            {
                this._AuthSaveType = saveType;
            }
    
            /// <summary>
            /// 处理用户登录
            /// </summary>
            /// <param name="fileterContext"></param>
            public void OnAuthorization(AuthorizationContext fileterContext)
            {
                if (fileterContext.HttpContext == null)
                    throw new Exception("次特性只适合于Web应用程序使用!");
                else {
                    switch (AuthSaveType)
                    { 
                        case "Session":
                            if (fileterContext.HttpContext.Session == null)
                                throw new Exception("服务器Session不可用!");
                            else if (!fileterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) && !fileterContext.ActionDescription.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
                            {
                                if (fileterContext.HttpContext.Session[_AuthSaveKey] == null)
                                    fileterContext.Result = new RedirectResult(_AuthUrl);
                            }
                            break;
                        case "Cookie":
                            if (!fileterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) && !fileterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
                            {
                                if (fileterContext.HttpContext.Request.Cookies[_AuthSaveKey] == null)
                                    fileterContext.Result = new RedirectResult(_AuthUrl);
                            }
                            break;
                        default:
                            throw new ArgumentNullException("用于保存登录信息的方式不能为空,只能为【Cookie】或者【Session】");
                    }
                }
            }
        }
    }
  • 相关阅读:
    《程序设计与数据结构》(上)课程总结
    20172321 2017-2018-2 《程序设计与数据结构》实验五报告
    20172321 2017-2018-2 《程序设计与数据结构》实验4报告
    20172321 2017-2018-2 《程序设计与数据结构》第11周学习总结
    暑假App
    20172314 2018-2019-1《程序设计与数据结构》查找与排序实验报告
    团队作业——第二周
    安卓游戏开发——团队作业第一周
    20172314 2018-2019-1《程序设计与数据结构》第九周学习总结
    20172314 《程序设计与数据结构》实验报告——树
  • 原文地址:https://www.cnblogs.com/xibianriluo/p/4850814.html
Copyright © 2020-2023  润新知