Web API自定义验证过滤器

beo*_*ulf 4 c# authentication owin asp.net-mvc-5 asp.net-web-api2

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

这是我发现的目前正在关注的教程.

Web API应该只处理"外部"HTTP调用,网站端目前将拥有自己的控制器(但可能会有变化).

如果可能,此过滤器应与已存在的身份2系统连接.

我所做的是然后我发送用户凭据,为用户分配一个令牌,然后我想使用该令牌来验证请求.有没有办法可以根据令牌过滤请求,或者我是否需要使用Owin身份及其令牌管理.我正在使用移动客户端(目前是iOS,也将包括android)来拨打电话.我可以参考的任何示例或教程?

令牌当前是字母数字字符和符号的随机组合.

谢谢.

PS我可以在需要的地方发布代码片段和内容.

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

小智 9

假设您认为向每个请求发送用户名和密码都不好.请在下面的实现中输出用户名和密码,因为我们不会在每个请求中发送用户名和密码.

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)