asp mvc 3 ActionFilter for basic authentication

后端 未结 4 1845
面向向阳花
面向向阳花 2020-12-30 14:29

I have an ASP MVC3 restful service that uses basic authentication. After searching stack overflow, I created the following code.

public class BasicAuthentic         


        
4条回答
  •  执笔经年
    2020-12-30 14:53

    1) Is an ActionFilterAttribute the best way to do this?
    I think so. This approach mirrors the implementation of the built in Authorize attribute.

    2) Is setting filterContext.Result the correct way to deny access to the controller method?
    Yes. Thats whats it there for. (1)

    3) Is there anything I'm doing wrong?

    • You assume that the content of the Authorization header is in the correct format and is correctly encoded.
    • You assume that the request is for basic authenication and not any other authentication scheme.
    • I would prefer to use HttpUnauthorizedResult() to send a http 401 error instead of a http 404 error via HttpNotFoundResult().

    Below in my implementation of your code (which I'm sure has its issues too).

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            try
            {
                if (String.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
                {
                    filterContext.Result = new HttpUnauthorizedResult();
                }
                else
                {
                    if (filterContext.HttpContext.Request.Headers["Authorization"].StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase))
                    {
                        string[] credentials = ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(filterContext.HttpContext.Request.Headers["Authorization"].Substring(6))).Split(':');
    
                        if (credentials.Length == 2)
                        {
                            if (String.IsNullOrEmpty(credentials[0]))
                            {
                                filterContext.Result = new HttpUnauthorizedResult();
                            }
                            else if (!(credentials[0] == "username" && credentials[1] == "passwords"))
                            {
                                filterContext.Result = new HttpUnauthorizedResult();
                            }
                        }
                        else
                        {
                            filterContext.Result = new HttpUnauthorizedResult();
                        }
                    }
                    else
                    {
                        filterContext.Result = new HttpUnauthorizedResult();
                    }
                }
    
                base.OnActionExecuting(filterContext);
            }
            catch
            {
                filterContext.Result = new HttpUnauthorizedResult();
            }
        }
    

    Notes

    • I haven't included illegal character checks for username and password.
    • I couldn't settle on how to implement exception handling so I have gone with simplicity.

    References

    (1) http://msdn.microsoft.com/en-us/magazine/gg232768.aspx

提交回复
热议问题