В AspBoilerPlate - Несанкционированная ошибка при вызове из Angular при включенной аутентификации Windows - PullRequest
0 голосов
/ 11 мая 2018

Уже поднимал этот вопрос и подумал, что я рассмотрел его в соответствии с тем, что предложено для ЭТОГО и ЭТОГО , но, похоже, нет! Я использую шаблон ABP (Angular и ASP .NET CORE Application) в Full .Net Framework. Я просто хочу использовать аутентификацию Windows для аутентификации пользователя.

Я добавил [Authorize] к Authenticate в TokenAuthController и, наконец, заполнил HttpContext.User.Identity.Name, но только когда я вызываю Authenticate от Swagger (http://localhost:21021/swagger). Но я получаю несанкционированную ошибку при вызове метода из Angular (login.service.ts):

POST http://localhost:21021/api/TokenAuth/Authenticate 401 (не авторизован)

Вот шаги, которые я предпринял до сих пор:

  1. Изменен launchSetting.json:

     "iisSettings": {
     "windowsAuthentication": true,
     "anonymousAuthentication": true,
     "iisExpress": {
        "applicationUrl": "http://localhost:21021/",
        "sslPort": 0
       }  
      },
    
  2. Добавлен источник внешней аутентификации:

     public class WindowsAuthSource : DefaultExternalAuthenticationSource<Tenant, User>, ITransientDependency
    {
    public override string Name
    {
        get { return "Windows Authentication"; }
    }
    
    public override Task<bool> TryAuthenticateAsync(string userNameOrEmailAddress, string plainPassword, Tenant tenant)
    {
        return Task.FromResult(true);
     }
    }
    
  3. Добавлен в CoreModule: Configuration.Modules.Zero().UserManagement.ExternalAuthenticationSources.Add<WindowsAuthSource>();

4.Настройка AuthConfigurer:

   services.AddAuthentication(opt => {
                opt.DefaultScheme = IISDefaults.AuthenticationScheme;
                opt.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme;
                opt.DefaultChallengeScheme = IISDefaults.AuthenticationScheme;
            });
  1. Настройка StartUp.cs:

        services.Configure<IISOptions>(iis =>
        {
            iis.AuthenticationDisplayName = "WINDOWS";
            iis.AutomaticAuthentication = true;
        });
    
  2. Изменен метод аутентификации в TokenAuthController:

      public async Task<AuthenticateResultModel> Authenticate([FromBody] 
      AuthenticateModel model)
      {
        //var username = WindowsIdentity.GetCurrent().Name.Split('\\').Last();
        var username = HttpContext.User.Identity.Name;
    
        model.UserNameOrEmailAddress = username;
        var loginResult = await GetLoginResultAsync(
            model.UserNameOrEmailAddress,
            model.Password,
            null
        );
    
        var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
    
        return new AuthenticateResultModel
        {
            AccessToken = accessToken,
            EncryptedAccessToken = GetEncrpyedAccessToken(accessToken),
            ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
            UserId = loginResult.User.Id
        };
    }
    
  3. Отправка фиктивного имени пользователя и пароля с login.service.ts:

    authenticate(finallyCallback?: () => void): void {
    finallyCallback = finallyCallback || (() => { });
    
    //Dummy data
    this.authenticateModel.userNameOrEmailAddress = "DummyUsername";
    this.authenticateModel.password = "DummyPassword";
    
    this._tokenAuthService
        .authenticate(this.authenticateModel)
        .finally(finallyCallback)
        .subscribe((result: AuthenticateResultModel) => {
            this.processAuthenticateResult(result);
        });
    }
    
...