У меня есть приложение Angular5 и веб-API2 в качестве уровня обслуживания. Я использую аутентификацию на основе токена Identity Framework OAuth Owin. Код CORS работает для запроса генерации токена, но для последующих запросов GET он не работает, и я получаю ошибку 401 Not Authorized.
Заголовок для генерации токена из Angular выглядит следующим образом:
this._httpHeader = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
Сервис для генерации токенов выглядит следующим образом:
getCurrentUserLogin(): Observable<any> {
if (sessionStorage.getItem('AccessToken') == null || sessionStorage.getItem('AccessToken') == 'undefined') {
let requestOptions = new RequestOptions({ headers: this._httpHeader, withCredentials: true });
return this._http.get(this._baseURL + "Authentication", requestOptions)
.map(res => {
if (res != null) {
return res.json();
}
})
.do(data => console.info('Token: ' + JSON.stringify(data)))
.catch(this.handleError);
}
Ниже приведен код CORS в веб-API: Global.asax.cs:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Headers.Add("Access-Control-Allow-Origin", ConfigurationManager.AppSettings["AllowAccessToDomain"]);
Response.Headers.Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization,headers");
Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
Response.Headers.Add("Access-Control-Allow-Credentials", "true");
Response.Headers.Add("Access-Control-Max-Age", "1728000");
Response.End();
}
}
WebAPIConfig.cs
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
EnableCorsAttribute cors = new EnableCorsAttribute(ConfigurationManager.AppSettings["AllowAccessToDomain"], "*", "*") { SupportsCredentials = true };
config.EnableCors(cors);
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Я могу успешно сгенерировать токен с помощью приведенного выше кода CORS. Но для приведенного ниже вызова службы из Angular он дает ошибку «Не авторизован»:
Заголовок для обычного GET-запроса от Angular:
this._httpHeader = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + sessionStorage.getItem('AccessToken')
}
Обычный сервисный вызов из Angular:
getHomeAccountTemplates(): Observable<HomeAccountTemplate[]> {
let requestOptions = new RequestOptions({ headers: this._httpHeader, withCredentials: true });
return this._http.get(this._baseURL + "Account/AccountTemplates", requestOptions)
.map(res => {
if (res != null) {
return res.json();
}
})
.catch(this.handleError);
}
Контроллер веб-API для вышеуказанного вызова службы:
[Authorize]
public class AccountController : ApiController
{
private readonly IAccountService _AccntServices;
#region Constructors
public AccountController()
{
_AccntServices = new AccountService();
}
#endregion
[HttpGet]
[Route("api/Account/AccountTemplates")]
public List<HomeAccountTemplate> GetAccountTemplates()
{
//int InstanceID = Convert.ToInt32(((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(c => c.Type.Contains("InstanceId")).Value);
int InstanceID = 1;
return _AccntServices.GetAccountTemplates(InstanceID);
}
}
Вышеупомянутый контроллер не обрабатывается, и выполнение останавливается на Global.asax. Я получаю сообщение об ошибке «Не авторизован». Пожалуйста, помогите, как это исправить.
Я еще не развернул его, но в веб-конфигурации я включил проверку подлинности Windows, потому что я использую Windows, зарегистрированное под именем пользователя, для проверки подлинности пользователя по таблице пользователей в базе данных приложения.
Когда я столкнулся с этой проблемой, я нашел решение в поиске в Google для чего-то вроде «IIS включить проверку подлинности Windows для одного маршрута» и включить проверку подлинности Windows для одного маршрута приложения ('/ login')
Не могли бы вы предоставить мне ссылку, по которой вы перешли? Как я уже сказал, я еще не развернул приложение, поэтому как мне включить проверку подлинности Windows для одного маршрута в Web Config?
Значит, в вашем приложении включена анонимная аутентификация?
Не авторизован - это не проблема CORS. Вы проверили заголовок запроса в Chrome Dev Tools, чтобы убедиться, что ваши правильные заголовки отправляются с запросом?
Переданные заголовки верны, я даже пытался получить доступ к службе Web Api из Postman, используя тот же заголовок, и это сработало.





CORS не должен влиять на запросы GET. Похоже, ваш веб-сервер (IIS?) Отклоняет запросы с этим заголовком
Authorization. Например, если вы отключите анонимный доступ и включите проверку подлинности Windows в IIS, вы не сможете пройти через токен-носитель.