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());
            }
  • 相关阅读:
    vscode sftp 本地目录设置问题
    Zend where or怎么传
    docker如何查看最近创建的容器
    基于apline构建php7+nginx
    修改layui tree组件支持上移下移
    mysql千万级数据表如何删除
    filezilla 链接ftp不显示本地目录 “您没有权限列出该目录内容”
    php使用socket通过tcp通信及php16进制求和校验位计算
    Session must be started before any output has been sent to the browser;问题解决
    mysql数据库中的union和union的区别(示例演示)
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12074607.html
Copyright © 2011-2022 走看看