使用ASP.NET MVC实现Restful基本身份验证

14

有人知道这是如何工作的吗?我正在使用.net会员提供程序,只想获取一个xml列表。我还在使用.net mvc sdk

问题是当我在控制器顶部添加[WebApiEnabled]时,我可以成功获取xml/json

但是当我在控制器顶部添加[Authenticate]时,我无法登录。

例如:

 curl -i -u "admin:pass" -H "Accept: application/xml" http://localhost:xxxx/Book

感谢您提前的帮助


你是否收到了错误信息?状态码是多少? - David
4个回答

9

7

好的,我已经弄清楚了,但解决方案可能有点不正规。我从 .net mvc 源代码中取出了 AuthorizeAttribute,并重新编写了 OnAutorization 方法。这对我来说绝对有效,但它仅适用于基本身份验证,我不确定这是否是最安全的方法。然而,它确实解决了 web 客户端能够访问安全的 .net mvc rest 服务的问题。

public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }


        string auth = filterContext.HttpContext.Request.Headers["authorization"];

        if (!String.IsNullOrEmpty(auth))
        {
            byte[] encodedDataAsBytes = Convert.FromBase64String(auth.Replace("Basic ", ""));
            string val = Encoding.ASCII.GetString(encodedDataAsBytes);
            string userpass = val;
            string user = userpass.Substring(0, userpass.IndexOf(':'));
            string pass = userpass.Substring(userpass.IndexOf(':') + 1);

            if (!System.Web.Security.Membership.Provider.ValidateUser(user, pass))
            {
                filterContext.Result = new HttpUnauthorizedResult();
            }

        }
        else
        {
            if (AuthorizeCore(filterContext.HttpContext))
            {


                HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
                cachePolicy.SetProxyMaxAge(new TimeSpan(0));
                cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
            }
            else
            {
                // auth failed, redirect to login page
                filterContext.Result = new HttpUnauthorizedResult();
            }
        }


    }

2
您可以使用HTTP摘要访问认证(一些实现细节在此这里这里),它比基本身份验证要强大得多,但仍存在安全权衡。 如果您需要更高的安全性,将服务放在SSL后面(如果有选项)就足够了。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接