【问题标题】:ASP.NET Web API always returns 401 unauthorized errorASP.NET Web API 总是返回 401 未经授权的错误
【发布时间】:2013-02-26 13:30:28
【问题描述】:

我在 asp.net web api 上使用自定义授权。我已点击以下链接 http://www.codeproject.com/Tips/376810/ASP-NET-WEB-API-Custom-Authorize-and-Exception-Han 我像这样在控制器中使用属性名称

[我的自定义属性]

公共类 userController : apicontroller {

}

但它总是显示 401 未经授权的异常,尽管身份验证状态被授权。我已经完全按照它在创建自定义授权属性的链接中进行了操作。

我的自定义授权类

 public class tokenAuthorize : AuthorizeAttribute
{
    DBEntity _objScrumDBEntities = new DBEntity ();
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);
        if (actionContext.Request.Headers.GetValues("authenticationToken") != null)
        {
            // get value from header
            string authenticationTokenValue = Convert.ToString(actionContext.Request.Headers.GetValues("authenticationToken").FirstOrDefault());
            ObjectParameter m_tokenParam = new ObjectParameter("status", typeof(string));
            _objScrumDBEntities.validateToken(authenticationTokenValue, m_tokenParam);
           string status = Convert.IsDBNull(m_tokenParam.Value) ? null : (string)m_tokenParam.Value;
            if (status == "false")
            {
                HttpContext.Current.Response.AddHeader("authenticationToken", authenticationTokenValue);
                HttpContext.Current.Response.AddHeader("AuthenticationStatus", "NotAuthorized");
                // actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
                 return;
            }

            else
            {
                HttpContext.Current.Response.AddHeader("authenticationToken", authenticationTokenValue);
                HttpContext.Current.Response.AddHeader("AuthenticationStatus", "Authorized");                
                return;

            }
            //return;
        }
        //actionContext.Response =  actionContext.Request.CreateResponse(HttpStatusCode.ExpectationFailed);
        //else
        // actionContext.Response.ReasonPhrase = "Please provide valid inputs";
    }
}

和我的控制器

[tokenAuthorize] 
public class myController : ApiController
{

    public IEnumerable<organization> Get()
    {
        return _objOrgRepository.GetAll();
    }

【问题讨论】:

  • 你能分享一些代码吗?这太少了,我们无法分析
  • 请看一下代码
  • 你调用服务的时候有authenticationToken http头对吗?

标签: json asp.net-web-api


【解决方案1】:

当您有自定义 AuthorizeAttribute 和自定义 RoleProvider 时,似乎 System.Web.Security.Roles.GetRolesForUser(Username) 不会自动连接。

因此,在您的自定义 AuthorizeAttribute 中,您需要从数据源中检索角色列表,然后将它们与作为参数传递给 AuthorizeAttribute 的角色进行比较。试试下面的代码

public class myController : ApiController

{

     [RequestKeyAuthorizeAttribute(Roles="Admin,Bob,Administrator,Clue")]
     public HttpResponseMessage Get()
     {
         return Request.CreateResponse(HttpStatusCode.OK, "RequestKeyAuthorizeTestController");
  }

【讨论】:

  • 感谢 Travis,但我的目标是根据从标头收到的令牌进行授权,而不是根据角色进行路由。但是我从“AuthorizationFilterAttribute”而不是“AuthorizeAttribute”继承了我的 customAuthorize 类,并且它有效很好。
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2018-01-09
  • 2018-05-19
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多