使用BASIC身份验证的.net web可执行文件到.net web api 401错误

时间:2015-07-24 14:18:53

标签: asp.net-web-api webclient basic-authentication

我不允许在工作中安装小提琴手,所以我有点失明。

我通过两个独立的visual studio实例在本地主机上运行web api和web可执行文件

我相当肯定我的Web API工作正常我手动将URL输入到Web浏览器中它会询问用户ID和密码然后返回我的JSON。

调用web api的Web可执行文件也正常工作,直到我尝试向控制器方法添加BASIC身份验证,现在我收到401错误。

这是来自可执行文件的代码。

[CustomAuthentication]
    [CustomAuthorization("qbert")]
    public class VSMRICController : ApiController
    {
        /// <summary>
        /// Returns all records in the DB2 VSM RIC table
        /// </summary>
        /// <param name="id">The ID of the data.</param>
        public IEnumerable<DB2VSMRIC> Get()
        {
            return DB2VSMRICRepository.getAll();
        }

这是web api上的控制器方法

public class CustomAuthenticationAttribute : Attribute, IAuthenticationFilter
    {
        // the job of the AuthenticateAsync method is to examine the request to see whether it contains
        // the information that is required to identify a user. Information about the request is provided
        // through an instance of the HttpAuthenticationContext class.
        public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
        {
            context.Principal = null;
            AuthenticationHeaderValue authentication = context.Request.Headers.Authorization;
            if (authentication != null && authentication.Scheme == "Basic")
            {
                string[] authData = Encoding.ASCII.GetString(Convert.FromBase64String(
                    authentication.Parameter)).Split(':');
                context.Principal
                    = ApiManager.AuthenticateUser(authData[0], authData[1]);
            }

            if (context.Principal == null)
            {
                context.ErrorResult 
                    = new UnauthorizedResult(new AuthenticationHeaderValue[]{
                        new AuthenticationHeaderValue("Basic")}, context.Request);
                    }
                    return Task.FromResult<object>(null);
            }

        public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
        {
            return Task.FromResult<object>(null);
        }

        public bool AllowMultiple
        {
            get { return false; }
        }

        }

这里是过滤器(用于身份验证)

{{1}}

我再次相信Web API工作正常,因为我可以通过直接导航到网址并在任何网络浏览器中提供凭据来获取JSON。我在可执行文件中设置标头时,我以为我做错了什么。有什么想法吗? (我通过2个visual studio实例在本地运行所有内容)

1 个答案:

答案 0 :(得分:1)

问题出在您设置基本身份验证的行上。它应该是

... =“基本”+凭据

而不是

... =“BASIC”+凭证

区分大小写和空格。

快乐的编码。