Request.Headers.Authorization即使在使用[授权]

时间:2017-11-30 15:39:05

标签: c# asp.net asp.net-mvc

我目前正致力于调用我的API控制器。我正在学习本教程:http://www.c-sharpcorner.com/article/asp-net-mvc5-rest-web-api-authorization/

WebApiController.cs:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Net;  
using System.Net.Http;  
using System.Web.Http;  
namespace WebApiAuthorization.Controllers {  
    [Authorize]  
    public class WebApiController: ApiController {  
        // GET api/values   
        public IEnumerable < string > Get() {  
            return new string[] {  
                "Hello REST API",  
                "I am Authorized"  
            };  
        }  
        // GET api/values/5   
        public string Get(int id) {  
            return "Hello Authorized API with ID = " + id;  
        }  
        // POST api/values   
        public void Post([FromBody] string value) {}  
        // PUT api/values/5   
        public void Put(int id, [FromBody] string value) {}  
        // DELETE api/values/5   
        public void Delete(int id) {}  
    }  
}  

AuthorizationHeaderHandler.cs

namespace WebApiAuthorization.Helper_Code.Common {  
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Net.Http;  
    using System.Net.Http.Headers;  
    using System.Security.Claims;  
    using System.Security.Principal;  
    using System.Text;  
    using System.Threading;  
    using System.Threading.Tasks;  
    using System.Web;  
    using WebApiAuthorization.Resources.Constants;  
    /// <summary>   
    /// Authorization for web API class.   
    /// </summary>   
    public class AuthorizationHeaderHandler: DelegatingHandler {#  
        region Send method.  
        /// <summary>   
        /// Send method.   
        /// </summary>   
        /// <param name="request">Request parameter</param>   
        /// <param name="cancellationToken">Cancellation token parameter</param>   
        /// <returns>Return HTTP response.</returns>   
        protected override Task < HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {  
            // Initialization.   
            IEnumerable < string > apiKeyHeaderValues = null;  
            AuthenticationHeaderValue authorization = request.Headers.Authorization;  //This is always null even as I put [Authorize] tag above my controller
            string userName = null;  
            string password = null;  
            // Verification.   
            if (request.Headers.TryGetValues(ApiInfo.API_KEY_HEADER, out apiKeyHeaderValues) && !string.IsNullOrEmpty(authorization.Parameter)) {  
                var apiKeyHeaderValue = apiKeyHeaderValues.First();  
                // Get the auth token   
                string authToken = authorization.Parameter;  
                // Decode the token from BASE64   
                string decodedToken = Encoding.UTF8.GetString(Convert.FromBase64String(authToken));  
                // Extract username and password from decoded token   
                userName = decodedToken.Substring(0, decodedToken.IndexOf(":"));  
                password = decodedToken.Substring(decodedToken.IndexOf(":") + 1);  
                // Verification.   
                if (apiKeyHeaderValue.Equals(ApiInfo.API_KEY_VALUE) && userName.Equals(ApiInfo.USERNAME_VALUE) && password.Equals(ApiInfo.PASSWORD_VALUE)) {  
                    // Setting   
                    var identity = new GenericIdentity(userName);  
                    SetPrincipal(new GenericPrincipal(identity, null));  
                }  
            }  
            // Info.   
            return base.SendAsync(request, cancellationToken);  
        }#  
        endregion# region Set principal method.  
        /// <summary>   
        /// Set principal method.   
        /// </summary>   
        /// <param name="principal">Principal parameter</param>   
        private static void SetPrincipal(IPrincipal principal) {  
            // setting.   
            Thread.CurrentPrincipal = principal;  
            // Verification.   
            if (HttpContext.Current != null) {  
                // Setting.   
                HttpContext.Current.User = principal;  
            }  
        }#  
        endregion  
    }  
}  

我面临的问题是SendAsync方法:

AuthenticationHeaderValue authorization = request.Headers.Authorization;  //This is always null even as I put [Authorize] tag above my controller

如果我放[Authorize],[AllowAnonymous],授权总是空的。寻求一些帮助。提前谢谢!

0 个答案:

没有答案