Действие Asp.net Core не возвращает 401 при использовании атрибута Authorize в потоке без принципа? - PullRequest
0 голосов
/ 10 февраля 2019

Я хотел добавить принцип в поток самостоятельно, без , используя механизм идентификации, который действительно напоминает мне старую механику аутентификации членства / форм.

Итак, я справился (успешно) создать запрос по принципу:

MyAuthMiddleware.cs

public class MyAuthMiddleware
{
    private readonly RequestDelegate _next;


    public MyAuthMiddleware(RequestDelegate next )
    {
        _next = next;

    }


    public async Task Invoke(HttpContext httpContext)
    {
        var claims = new List<Claim>  
        {  
            new Claim("userId", "22222222")  
        };  
        ClaimsIdentity userIdentity = new ClaimsIdentity(claims ,"MyAuthenticationType");  
        ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);

         httpContext.User = principal;
         await _next(httpContext);
    }
}

Метод настройки:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //app.UseAuthentication(); //removed it. I will set the thread manually
            if (env.IsDevelopment()) app.UseDeveloperExceptionPage();

            app.UseMyAuthMiddleware(); // <---------- Myne

            app.UseMvc();
            app.Run(async context => { await context.Response.WriteAsync("Hello World!"); });
        }

А вот действие в контроллере: (атрибут Notice Authorize)

    [HttpGet]
    [Route("data")]
    [Authorize]
    public IActionResult GetData()
    {

        var a=User.Claims.First(f => f.Type == "userId");
        return new JsonResult(new List<string> {"a", "b",a.ToString() , User.Identity.AuthenticationType});
    }

Хорошо. Давайте попробуем вызвать этот метод. Обратите внимание, что работает :

enter image description here

Так в чем же проблема ??

Обратите внимание, что есть атрибут [Authorize].Теперь давайте удалим
принцип установки в потоке (удалив эту строку):

//httpContext.User = principal; // line is remarked

Но теперь, когда я перехожу к:

http://localhost:5330/api/cities/data

, меня перенаправляют на:

http://localhost:5330/Account/Login?ReturnUrl=%2Fapi%2Fcities%2Fdata

Но я ожидаю увидеть несанкционированную ошибку.

Я после ответов WebApi.Это не веб-сайт, а API.

Вопрос:

Почему я не вижу неавторизованную ошибку?И как я могу заставить его появиться?

Nb вот мои ConfigureServices:

 public void ConfigureServices(IServiceCollection services)
        {
             services.AddAuthentication( CookieAuthenticationDefaults.AuthenticationScheme ) 
                  .AddCookie( CookieAuthenticationDefaults.AuthenticationScheme,  a =>
                  {
                      a.LoginPath = "";
                      a.Cookie.Name = "myCookie";


                  });

            services.AddMvc();
        }

РЕДАКТИРОВАТЬ

В настоящее время Что мне удалось сделатьэто использовать OnRedirectionToLogin:

enter image description here

Но это будет действительно разочаровывающим, если это путь.Я ожидаю, что это будет похоже на webapi.

1 Ответ

0 голосов
/ 11 февраля 2019

Реализация по умолчанию делегата OnRedirectToLogin выглядит следующим образом: this :

public Func<RedirectContext<CookieAuthenticationOptions>, Task> OnRedirectToLogin { get; set; } = context =>
{
    if (IsAjaxRequest(context.Request))
    {
        context.Response.Headers["Location"] = context.RedirectUri;
        context.Response.StatusCode = 401;
    }
    else
    {
        context.Response.Redirect(context.RedirectUri);
    }
    return Task.CompletedTask;
};

Как видно из приведенного выше кода, ответ, который отправляется клиенту, зависит отрезультат IsAjaxRequest(...), который сам по себе выглядит следующим образом:

private static bool IsAjaxRequest(HttpRequest request)
{
    return string.Equals(request.Query["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal) ||
        string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal);
}

Это означает, что ответом будет перенаправление 401, если для X-Requested-With заголовка запроса или значения строки запроса установлено значениеXMLHttpRequest.Когда вы нажимаете на конечную точку непосредственно из браузера или изнутри, например, в Fiddler, это значение не устанавливается, и, как отмечалось, ответом является 302.В противном случае, при использовании XHR или Fetch в браузере, это значение устанавливается для вас в качестве заголовка, и поэтому возвращается 401.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...