ASP. NET Ядро 3.1: вход с использованием идентификатора Web API - PullRequest
2 голосов
/ 01 апреля 2020

Я создаю CookieAutentecation signin для моего веб-API.

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

Но когда я ставлю контрольные точки в своих контроллерах и проверяю HttpContext.User, все всегда равно нулю, ни имени пользователя, ни претензий, ничего.

Что еще мне нужно, чтобы эта работа? Требуются ли дополнительные шаги для приложения Web API против MVC?

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, act => {
                act.LoginPath = "/api/login";
                act.AccessDeniedPath = "/api/login";
                act.SlidingExpiration = true;
            });

    services.AddControllers();

    services.AddServices(); // <- Own app domain services 
    services.AddDataAccess(); // <- Own app domain data access
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseCors(
            options => options.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
        );

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
}

api / login

var user = new SecurityUser()
        {
            UserID = 123,
            CompleteName = "Test user",
            FirstName = "Test",
            Email = "test.user@123.com"
        };
var identity = user.ToClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, 123);
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), new AuthenticationProperties()
        {
            AllowRefresh = true,
           ExpiresUtc = DateTime.UtcNow.AddDays(7),
           IsPersistent = true,
        });

ToClaimsIdentity метод расширения:

public static ClaimsIdentity ToClaimsIdentity(this SecurityUser user, string authenticantionType, int auditUserID)
{
        var claims = new List<Claim>()
        {
            new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString()),
            new Claim(ClaimTypes.Email, user.Email),
            new Claim(ClaimTypes.Name, user.FirstName),
            new Claim(SecurityUserClaimTypes.AuditUserID, auditUserID.ToString())
        };

        var identity = new ClaimsIdentity(claims, authenticantionType);
        return identity;
}

Любая помощь будет принята с благодарностью.

Редактировать - это то, что я принимаю о ? enter image description here

1 Ответ

1 голос
/ 01 апреля 2020

Спасибо за вашу помощь, ребята!

Я наконец понял, что это клиент, я сделал три вещи:

  • CORS была проблемой, в моем вызове метода .UseCors мой Api, я разрешил учетные данные: .AllowCredentials()
  • В моем клиентском приложении, использующем Blazor, я нашел эту статью здесь , в которой говорилось, что мне нужно настроить конфигурацию запроса http, чтобы включить учетные данные, поэтому в моем клиентском приложении startup.cs:
    WebAssemblyHttpMessageHandlerOptions.DefaultCredentials = FetchCredentialsOption.Include;
  • Я использую Http, а не Https на своем локальном компьютере, и Chrome жаловался на SameSite, так что я мой Api StartUp.cs, где я звоните AddAuthentication...AddCookie Я добавил это: options.Cookie.SameSite = SameSiteMode.Unspecified;

Я не полностью понимаю SameSite ... и я также натолкнулся на JSON Web Tokens (JWT) .
Но мне это не интересно, пока оно работает. ; -)

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