WebApi身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebApi身份验证相关的知识,希望对你有一定的参考价值。

一、通过Http请求(不通过过滤器)

        public static UserDTO GetAuthInfo()
        {
            var cur = HttpContext.Current;
            var account= cur.Request.Headers.GetValues(Consts.HTTP_HEADER_AUTH_USER);
            var key = cur.Request.Headers.GetValues(Consts.HTTP_HEADER_AUTH_KEY);

            if (account!=null && key!=null)
            {
                if (account.Any() && key.Any())
                {
                    string strName = account.First();
                    string strKey = key.First();
                    string actionUri = cur.Request.Url.OriginalString;

                    var userInfo = UserService.GetPrivateKey(strName);
                    if (userInfo != null && WebApiServerHelper.VerifyAuthKey(strName, strKey, actionUri, userInfo.Token))
                    {
                        return userInfo;
                    }
                }
            }
            return null;
        }

二、通过过滤器

    public class WebApiAuthFilterAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            if (actionContext.Request.Headers.Contains(Consts.HTTP_HEADER_AUTH_USER) && actionContext.Request.Headers.Contains(Consts.HTTP_HEADER_AUTH_KEY))
            {
                IEnumerable<string> arrCustomAuthName = actionContext.Request.Headers.GetValues(Consts.HTTP_HEADER_AUTH_USER);
                IEnumerable<string> arrCustomAuthKey = actionContext.Request.Headers.GetValues(Consts.HTTP_HEADER_AUTH_KEY);
                if (arrCustomAuthName.Any() && arrCustomAuthKey.Any())
                {
                    
                    WebApiPrincipal principal = GetWebApiPrincipal(arrCustomAuthName.First(), arrCustomAuthKey.First(), actionContext.Request.RequestUri.ToString());
                    if (principal != null)
                    {
                        HttpContext.Current.User = principal;
                        Thread.CurrentPrincipal = principal;
                    }
                }
            }
            //判断用户是否登录
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
                throw new WebApiException(EnumException.身份验证失败);
        }
    }
}

    public class WebApiIdentity : IIdentity
    {
        public UserDTO Owner { get; set; }

        public string Name { get; set; }

        public string Role { get; set; }

        /// 表示用的验证方式是自定义验证
        public string AuthenticationType
        {
            get { return "Custom"; }
        }

        public bool IsAuthenticated
        {
            get { return true; }
        }
    }

    public static class ApiControlerExtension
    {
        //方便获取用户的扩展方法
        public static UserDTO GetUser(this ApiController controller)
        {
            if (controller.User is WebApiPrincipal)
            {
                return ((WebApiIdentity)controller.User.Identity).Owner;
            }
            else
            {
                return null;
            }
        }
}

 

以上是关于WebApi身份验证的主要内容,如果未能解决你的问题,请参考以下文章

WebApi身份验证

在 Angular2/4/5 中,如何基于基于令牌的身份验证安全地调用 WebAPI 操作

WebApi 登录身份验证

向 ASP.NET WebApi 2.2 添加身份验证

使用 Asp.Net 下的 owin 和 LinkedIn 身份验证提供程序进行 WebApi 身份验证

使用 WebAPI 进行 RESTFul 身份验证