2017-01-05 5 views
1

Я использую IdentityServer 3 для аутентификации. Когда пользователь аутентифицируется, IdentityServer делает запрос «POST» на URL приложения клиента. Например, http://localhost/home пока все хорошо работает.Как разместить токен Antiforgery от IdentityServer 3

Приложение для моего клиента разработано в ASP.NET Core. В клиентском приложении я хочу проверить каждый запрос POST. Поэтому вместо добавления атрибута ValidateAntiForgeryToken для каждого метода действий я создал промежуточное программное обеспечение, которое проверяет каждый запрос POST.

public class ValidateAntiForgeryTokenMiddleware 
{ 
    private readonly RequestDelegate _next; 
    private readonly IAntiforgery _antiforgery; 

    public ValidateAntiForgeryTokenMiddleware(RequestDelegate next, IAntiforgery antiforgery) 
    { 
     _next = next; 
     _antiforgery = antiforgery; 
    } 

    public async Task Invoke(HttpContext httpContext) 
    { 
     if (httpContext.Request.Method.ToUpper() == "POST") 
     { 
      await _antiforgery.ValidateRequestAsync(httpContext); 
     } 

     await _next(httpContext); 
    } 
} 

Проблема здесь, поскольку identityserver также делает POST, промежуточное программное обеспечение пытается проверить, что запрос, но запрос POST выдает следующее сообщение об ошибке

«Необходимое antiforgery печенье \». AspNetCore .Antiforgery.AXelvXewLHI \ "нет".

В Identity Server у меня есть пользовательская страница входа. и я установил маркер анти-подделки на странице входа.

<div ng-show="model.loginUrl"> 
    <div class="cr-login-dialog col-md-6 col-md-offset-3"> 
     <form name="form" method="post" action="{{model.loginUrl}}" class="form-horizontal" role="form"> 
      <anti-forgery-token token="model.antiForgery"></anti-forgery-token> 
      <div class="form-group"> 
       //user name controls goes here 
      </div> 
      <div class="form-group"> 
       //password controls goes here 
      </div> 
      <div class="form-group" ng-show="model.allowRememberMe"> 
       // remember me controls goes here 
      </div> 
     </form> 
    </div> 
</div> 

ответ

0

Вы должны отделить свой анти-XSRF промежуточное программное обеспечение, чтобы работать только на ваши запросы, а не запросов к IdentityServer. IdentityServer выполняет свой собственный анти-xsrf-токен, не связанный с реализацией MVC (поскольку IdentityServer не имеет зависимостей от MVC).

+0

Ну, это проблема. Промежуточное ПО не может отличить, если запрос «POST» поступает с IdentityServer или браузера пользователя. – LP13

+0

Тогда использование MW как места для реализации, это не правильный выбор. –

+0

'Вы должны разделить ваше промежуточное ПО ant-xsrf только для выполнения своих запросов, а не для запросов IdentityServer .......'. Обратите внимание, что промежуточное программное обеспечение будет пытаться проверить запрос 'from' identityserver. и я бы хотел, чтобы токен POST antiforgery, когда он перенаправляет на стартовую страницу клиентского приложения – LP13

 Смежные вопросы

  • Нет связанных вопросов^_^