Я хотел добавить принцип в поток самостоятельно, без , используя механизм идентификации, который действительно напоминает мне старую механику аутентификации членства / форм.
Итак, я справился (успешно) создать запрос по принципу:
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});
}
Хорошо. Давайте попробуем вызвать этот метод. Обратите внимание, что работает :
Так в чем же проблема ??
Обратите внимание, что есть атрибут [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:
Но это будет действительно разочаровывающим, если это путь.Я ожидаю, что это будет похоже на webapi.