使用ASP.NET MVC进行基本身份验证

时间:2009-09-10 19:11:17

标签: asp.net-mvc authentication rest

任何人都知道这是如何工作的,我正在使用.net成员资格提供程序,只想拉出一个xml列表。我也在使用.net mvc sdk。所以这就是我在控制器顶部添加[WebApiEnabled]时我可以成功拉出xml / json的问题。但是当我将[Authenticate]添加到我的控制器顶部时,我无法登录。例如curl -i -u“admin:pass”-H“Accept:application / xml”http://localhost:xxxx/Book

提前感谢您的帮助

4 个答案:

答案 0 :(得分:9)

我想我会在这里为任何人(比如我)添加这个,他们不能完全理解作者在这里提供的答案。这是一篇博文,我刚刚描述了如何使用[CustomBasicAuthorize]属性来完成此操作,该属性的使用方式与MVC附带的[Authorize]属性相同:http://cacheandquery.com/blog/2011/03/customizing-asp-net-mvc-basic-authentication/

答案 1 :(得分:8)

好吧,所以我想出来了,但解决方案可能有点贫民窟。我从.net mvc源获取了AuthorizeAttribute并重新编码了OnAutorization方法。这绝对适用于我,但它只适用于基本身份验证,我不知道这是否是最安全的方法。但它确实解决了Web客户端能够访问安全.net mvc休息服务的问题。

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 :(得分:2)

您可以使用HTTP摘要访问身份验证(某些实施详细信息herehere),这比基本功能强很多,但它仍然是security trade-off。如果你需要更多的安全性,那么将服务置于SSL之后(如果它是一个选项)就足够了。

答案 3 :(得分:0)

如何在基本身份验证中使用REST,请参阅此stackoverflow问题的答案:

Basic Authentication with WCF REST service to something other than windows accounts?