Web API自定义身份验证筛选器

本文关键字:筛选 身份验证 自定义 API Web | 更新日期: 2023-09-27 18:01:04

我正试图为我的web api控制器制作一个自定义过滤器,作为ASP.NET MVC 5网站/应用程序的一部分,以检查我存储在数据库中的特定令牌的请求标头。我发现的大多数示例都包含用户凭据,然后使用身份验证用户。不完全是我想要的。

这是我找到的教程,目前正在学习。

web API应仅处理"外部"HTTP调用,网站方目前将拥有自己的控制器(但可能会更改(。

如果可能的话,这个过滤器应该与已经存在的标识2系统接口。

我所做的是发送用户凭据,然后为用户分配一个令牌,然后我想使用该令牌来验证请求。有没有一种方法可以根据令牌过滤请求,或者我需要使用Owin身份和他们的令牌管理。我正在使用一个移动客户端(目前是iOS,也将包括android(来打电话。有什么我可以参考的例子或教程吗?

该令牌目前是字母数字字符和符号的随机组合。

谢谢。

附言:我可以在需要的地方发布代码片段和其他东西。

编辑:HTTPRequest将根据它们是否包含我们数据库/系统中存在的令牌进行筛选。包含令牌或不存在于我们系统中的请求将收到未经授权的错误(401?(

Web API自定义身份验证筛选器

假设您认为向每个请求发送用户名和密码是不好的。请参阅我下面没有用户名和密码的实现,因为我们不会在每个请求中都发送用户名和密码。

public class AuthenticationFilter : AuthorizationFilterAttribute
    {
        /// <summary>
        /// read requested header and validated
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var identity = FetchFromHeader(actionContext);
            if(identity != null)
            {
                var securityService = actionContext.ControllerContext.Configuration.DependencyResolver.GetService(typeof(ILoginService)) as ILoginService;
                if (securityService.TokenAuthentication(identity))
                {
                    CurrentThread.SetPrincipal(new GenericPrincipal(new GenericIdentity(identity), null), null, null);
                }
                else
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                    return;
                }
            }
            else
            {
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
                return;
            }
            base.OnAuthorization(actionContext);
        }
        /// <summary>
        /// retrive header detail from the request 
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        private string FetchFromHeader(HttpActionContext actionContext)
        {
            string requestToken = null;
            var authRequest = actionContext.Request.Headers.Authorization;
            if (authRequest != null && !string.IsNullOrEmpty(authRequest.Scheme) && authRequest.Scheme == "Basic")
                requestToken = authRequest.Parameter;
            return requestToken;
        }
    }

您可以通过属性注入服务依赖项(属性注入(来使这个过滤器单元可测试。对于自定义属性,我们不希望通过构造函数传递依赖关系。我们希望属性易于使用要重写@Raj已经开始的内容,可以如下所示:

   public class AuthenticationFilter : AuthorizationFilterAttribute
    {
        [Dependency]
        public ILoginService LoginService { get; set; }
        /// <summary>
        /// read requested header and validated
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var identity = FetchFromHeader(actionContext);
            if (identity != null)
            {
                if (LoginService.TokenAuthentication(identity))
                {
                    CurrentThread.SetPrincipal(new GenericPrincipal(new GenericIdentity(identity), null), null, null);
                    //IPrincipal principal = new GenericPrincipal(new GenericIdentity(identity), new string[] { "myRole" });
                    //Thread.CurrentPrincipal = principal;
                    //HttpContext.Current.User = principal;             
                }
                else
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                    return;
                }
            }
            else
            {
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
                return;
            }
            base.OnAuthorization(actionContext);
        }
        /// <summary>
        /// retrive header detail from the request 
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        private string FetchFromHeader(HttpActionContext actionContext)
        {
            string requestToken = null;
            var authRequest = actionContext.Request.Headers.Authorization;
            if (authRequest != null && !string.IsNullOrEmpty(authRequest.Scheme) && authRequest.Scheme == "Basic")
                requestToken = authRequest.Parameter;
            return requestToken;
        }
    }