zoukankan      html  css  js  c++  java
  • webapi添加basic认证

     

    BasicAbstractAuthorize:抽象类,子类中校验用户名密码,并创建Principal 

    BasicAuthorize:实现类

        //base.OnAuthorization(),此方法内部,调用IsAuthorized()判断是否授权,如果未授权调用HandleUnauthorizedRequest()方法
        //base.IsAuthorized(),判断Principal、Identity是否为空,为空则未授权
        //base.HandleUnauthorizedRequest(),此方法内部创建Response,状态码401;
        //
        public abstract class BasicAbstractAuthorize : AuthorizeAttribute
        {
            public override void OnAuthorization(HttpActionContext actionContext)
            {
    
                var authenticationHeader = actionContext.Request.Headers.Authorization;
    
                if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Count > 0
                    || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Count > 0)
                {//如果有AllowAnonymous特性,就不检查
                    base.OnAuthorization(actionContext);
                }
                else
                {
                    if (authenticationHeader != null && authenticationHeader.Scheme == "Basic" && !string.IsNullOrEmpty(authenticationHeader.Parameter))
                    {
                        var userNameAndPassword = this.GetUserNameAndPassword(authenticationHeader.Parameter);
                        actionContext.RequestContext.Principal = this.Authenticate(userNameAndPassword.Item1, userNameAndPassword.Item2, actionContext);
                    }
                    if (actionContext.RequestContext.Principal == null)
                    {
                        base.HandleUnauthorizedRequest(actionContext);
                    }
                }
    
            }
            /// <summary>
            /// 校验用户名、密码
            /// </summary>
            /// <returns></returns>
            public abstract IPrincipal Authenticate(string userName, string password, HttpActionContext actionContext);
            /// <summary>
            /// 获取用户名、密码
            /// </summary>
            /// <param name="authenticationParameter"></param>
            /// <returns></returns>
            private Tuple<string, string> GetUserNameAndPassword(string authenticationParameter)
            {
                if (!string.IsNullOrWhiteSpace(authenticationParameter))
                {
                    var data = Encoding.ASCII.GetString(Convert.FromBase64String(authenticationParameter)).Split(':');
                    return new Tuple<string, string>(data[0], data[1]);
                }
                return null;
            }
        }
    
        public class BasicAuthorize : BasicAbstractAuthorize
        {
            public override IPrincipal Authenticate(string userName, string password, HttpActionContext actionContext)
            {
                //校验用户名、密码
                if (userName == "zhangsan" && password == "123")
                {
                    ClaimsIdentity identity = new ClaimsIdentity(new List<Claim> {
                        new Claim("UserName",userName)
                    });
                    ClaimsPrincipal principal = new ClaimsPrincipal(identity);
                    return principal;
                }
                return null;
    
            }
        }

     添加Filter

            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
                RegisterFilters(config.Filters);
            }
            public static void RegisterFilters(HttpFilterCollection filters)
            {
                filters.Add(new BasicAuthorize());
            }
  • 相关阅读:
    SFTP的使用
    java操作文件的创建、删除、遍历
    ios UICollectionView滑动时操作
    IOS自带json解析类解析json
    IOS把文件保存进沙盒目录
    python3.4安装suds
    Lua for windows中SciTe开启支持python的方法
    修改tabbarcontroller选中图片及选中颜色
    Android新版本SDK打开旧版本项目报错解决
    PHP5.4连接sqlserver
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12074607.html
Copyright © 2011-2022 走看看