有人知道这是如何工作的吗?我正在使用.net会员提供程序
,只想获取一个xml
列表。我还在使用.net mvc sdk
。
问题是当我在控制器顶部添加[WebApiEnabled]
时,我可以成功获取xml/json
。
但是当我在控制器顶部添加[Authenticate]
时,我无法登录。
例如:
curl -i -u "admin:pass" -H "Accept: application/xml" http://localhost:xxxx/Book
感谢您提前的帮助
有人知道这是如何工作的吗?我正在使用.net会员提供程序
,只想获取一个xml
列表。我还在使用.net mvc sdk
。
问题是当我在控制器顶部添加[WebApiEnabled]
时,我可以成功获取xml/json
。
但是当我在控制器顶部添加[Authenticate]
时,我无法登录。
例如:
curl -i -u "admin:pass" -H "Accept: application/xml" http://localhost:xxxx/Book
感谢您提前的帮助
如果您(像我一样)对作者提供的答案感到困惑,我认为在这里添加以下内容会对您有所帮助。我刚完成了一篇博客文章,描述了如何使用[CustomBasicAuthorize]
属性实现与MVC带有的[Authorize]
属性相同的功能,文章链接如下:http://cacheandquery.com/blog/2011/03/customizing-asp-net-mvc-basic-authentication/
好的,我已经弄清楚了,但解决方案可能有点不正规。我从 .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();
}
}
}