string userName = _httpContextAccessor.HttpContext.User.Identity.Name; the userName gives always Null value.

Pradeep Kumar Gavuji 1 Reputation point
2021-07-22T08:35:32.947+00:00

Hi All,

I am using ASP.NET Core Web API (netcoreapp3.1) , I need to get the logged-in user name using the "User.Identity.Name" but this value always returns null, struggling for 4 days, any help is appreciated.
Below is the code reference.

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerUI;
using FM21.API.Extensions;
using FM21.API.Helpers;
using Microsoft.AspNetCore.Server.IISIntegration;
using AutoMapper;
using FM21.Core;

namespace FM21.API
{
public class Startup
{

    //readonly string AllowNellsonOrigins = "AlowNellsonOrigins";

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        SetupAppConfigKeys();
        ServiceExtensions.ConfigureLoggerService(configuration);
    }

    public IConfiguration Configuration { get; }


    public void ConfigureServices(IServiceCollection services)
    {

        services.ConfigureCors();
        services.AddMvc(options =>
        {
            options.Filters.Add(typeof(ValidateModelAttribute));
        })
                .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

        services.Configure<ApiBehaviorOptions>(options =>
        {
            options.SuppressModelStateInvalidFilter = true;
        });
        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddMemoryCache();
        services.ConfigureIISIntegration();

        services.AddHttpContextAccessor();

        //services.ConfigureDBContext();
        services.ConfigureRepositoryAndServices();
        services.SetupAPIVersioning();
        services.ConfigureControllerAndJsonSettings();
        services.ConfigureLocalization();
        services.ConfigureSwagger();
        services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
    }

    /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IExceptionHandler exceptionHandler)
    {
        app.UseCors("CorsPolicy");
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.Use(async (context, next) =>
        {
            app.WebWorker(context);
            await next.Invoke();
        });


        app.UseGlobalExceptionHandler(exceptionHandler);
        app.UseApiVersioning();
        app.UseHttpsRedirection();
        app.AddLocalization();
        app.AddSwagger(env);
        app.UseRouting();
        app.UseAuthentication();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
        exceptionHandler.LogInformation("API Started..");
    }
    /// <summary>
    /// Fectch and set global variables
    /// </summary>
    public void SetupAppConfigKeys()
    {
        ConfigurationConstants.DbConnectionString = Configuration.GetConnectionString("AppDBContextCon");
        ConfigurationConstants.EnableLog = Configuration.GetSection("AppSettings").GetValue<bool>("EnableLog");
        ConfigurationConstants.LogFilePath = Configuration.GetSection("AppSettings").GetValue<string>("LogFilePath");
        ConfigurationConstants.SupportedLocalization = Configuration.GetSection("AppSettings").GetValue<string>("Localization");
        ConfigurationConstants.CacheDurationInSecond = Configuration.GetSection("AppSettings").GetValue<int>("CacheDurationInSecond");
        ConfigurationConstants.AllowedOrigins = Configuration.GetSection("AppSettings").GetValue<string>("AllowedOrigins").Split(",");
        ApplicationConstants.Domain = Configuration.GetSection("AppSettings").GetValue<string>("Domain");
        ApplicationConstants.ADUserGroup = Configuration.GetSection("AppSettings").GetValue<string>("ADUserGroup");
    }
}

}


Controller Code

[SwaggerOperation(Summary = "Get current window login user information", Tags = new string[] { "UserMaster" })]
[HttpGet("GetCurrentUser")]
public async Task<IActionResult> GetCurrentUser()
{

        var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // will give the user's userId
        var userName1 = User.FindFirstValue(ClaimTypes.Name); // will give the user's userName
        string userName = _httpContextAccessor.HttpContext.User.Identity.Name;
        var response = await userMasterService.GetCurrentUser(User.Identity.Name);
        return new JsonResult(response);
    }

ServiceExtensions.cs

using FluentValidation;
using FM21.API.Helpers;
using FM21.Core;
using FM21.Core.Localization;
//using FM21.Core.Localization;
using FM21.Core.Validator;
//using FM21.Core.Validator;
using FM21.Data;
using FM21.Data.Infrastructure;
using FM21.Data.Repository;
//using FM21.Data.Repository;
using FM21.Service;
//using FM21.Service.Caching;
//using FM21.Service.Interface;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Localization.Routing;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using Serilog;
using Serilog.Events;
using Swashbuckle.AspNetCore.SwaggerUI;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using FM21.Data.Repository.Interface;
using FM21.Service.Interface;
using FM21.Core.DTO;

namespace FM21.API.Extensions
{
public static class ServiceExtensions
{
public static void ConfigureCors(this IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("CorsPolicy", policyBuilder =>
{
policyBuilder
.WithOrigins(ConfigurationConstants.AllowedOrigins).AllowCredentials()
//.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
}

    public static void ConfigureIISIntegration(this IServiceCollection services)
    {
        services.Configure<IISOptions>(options =>
        {
            options.AutomaticAuthentication = true;
        });
    }

    public static void SetupAPIVersioning(this IServiceCollection services)
    {
        services.AddApiVersioning(options =>
        {
            options.ReportApiVersions = true;
            options.AssumeDefaultVersionWhenUnspecified = true;
            options.DefaultApiVersion = new ApiVersion(1, 0);
            options.UseApiBehavior = true;
            //options.ApiVersionReader = new HeaderApiVersionReader("version");
        });
    }

    public static void ConfigureControllerAndJsonSettings(this IServiceCollection services)
    {
        services.AddControllers()
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.Converters.Add(new StringEnumConverter());
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            })
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            });
    }

    public static void ConfigureDBContext(this IServiceCollection services, IConfiguration config)
    {
        services.AddDbContext<AppEntities>(options => options.UseSqlServer(ConfigurationConstants.DbConnectionString));
    }

    public static void ConfigureRepositoryAndServices(this IServiceCollection services)
    {
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddScoped<IUnitOfWork, UnitOfWork>();
        services.AddScoped<IDatabaseFactory, DatabaseFactory>();
        //services.AddScoped<ICacheProvider, CacheProvider>();
        services.Add(new ServiceDescriptor(typeof(IRepository<>), typeof(Repository<>), ServiceLifetime.Scoped));
        //services.AddScoped<IWebWorker, WebWorker>();
        services.AddSingleton<IExceptionHandler, ExceptionHandler>();

        #region Repository
        services.AddScoped<ICustomerRepository, CustomerRepository>();
        services.AddScoped<IIngredientMasterRepository, IngredientMasterRepository>();
        services.AddScoped<IBrokerRepository, BrokerRepository>();
        services.AddScoped<ISupplierMasterRepository, SupplierMasterRepository>();
        services.AddScoped<ISiteRepository, SiteRepository>();
        services.AddScoped<IIngridentCategoryRepository, IngridentCategoryRepository>();
        services.AddScoped<IIngredientNutrientRepository, IngredientNutrientRepository>();

        #endregion

        #region Services
        services.AddScoped<ICustomerService, CustomerService>();
        services.AddScoped<IIngredientService, IngredientMasterService>();
        services.AddScoped<ICommonService, CommonService>();
        services.AddScoped<ISupplierMasterService, SupplierMasterService>();
        services.AddScoped<ISiteService, SiteService>();
        services.AddScoped<IIngredientCategoryService, IngredientCategoryService>();
        services.AddScoped<IAllergenService, AllergenMasterService>();
        services.AddScoped<IUserMasterService, UserMasterService>();

        services.AddScoped<IRoleService, RoleService>();
        services.AddScoped<IPermissionService, PermissionService>();
        #endregion

        #region Validator
        //services.AddSingleton<IValidator<RoleMasterModel>, RoleMasterValidator>();
        //services.AddSingleton<IValidator<PermissionMasterModel>, PermissionMasterValidator>();
        //services.AddSingleton<IValidator<InstructionMasterModel>, InstructionMasterValidator>();
        //services.AddSingleton<IValidator<InstructionGroupMasterModel>, InstructionGroupMasterValidator>();
        //services.AddSingleton<IValidator<CustomerModel>, CustomerValidator>();
        services.AddSingleton<IValidator<CustomerModel>, CustomerValidator>();
        services.AddSingleton<IValidator<IngredientMasterModel>, IngredientValidator>();
        services.AddSingleton<IValidator<SiteModel>, SiteValidator>();
        services.AddSingleton<IValidator<IngridentCategoryModel>, IngridentCategoryValidator>();
        //services.AddSingleton<IValidator<RegulatoryModel>, RegulatoryMasterValidator>();
        //services.AddSingleton<IValidator<SupplierMasterModel>, SupplierMasterValidator>();
        //services.AddSingleton<IValidator<AllergenMasterModel>, AllergenMasterValidator>();
        #endregion
    }

    public static void ConfigureLoggerService(IConfiguration configuration)
    {
        Log.Logger = new LoggerConfiguration()
                        .Filter.ByExcluding(_ => !ConfigurationConstants.EnableLog)
                        .MinimumLevel.Debug()
                        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                        .Enrich.FromLogContext()
                        .WriteTo.File(
                            ConfigurationConstants.LogFilePath,
                            fileSizeLimitBytes: 1_000_000,
                            rollingInterval: RollingInterval.Day,
                            rollOnFileSizeLimit: true,
                            shared: true,
                            flushToDiskInterval: TimeSpan.FromSeconds(1)
                        )
                        .CreateLogger();
    }

    public static void ConfigureLocalization(this IServiceCollection services)
    {
        services.AddSingleton<IdentityLocalizationService>();
        services.AddLocalization(o =>
        {
            // We will put our translations in a folder called Resources
            o.ResourcesPath = "Resources";
        });
        services.AddSingleton<IStringLocalizerFactory, JsonStringLocalizerFactory>();
        services.AddSingleton<IStringLocalizer, JsonStringLocalizer>();
        services.AddMvc()
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; })
                .AddDataAnnotationsLocalization(options => { });
        CultureInfo.CurrentCulture = new CultureInfo("en-US");
    }

    public static void AddLocalization(this IApplicationBuilder app)
    {
        IList<CultureInfo> supportedCultures = new List<CultureInfo>();
        foreach (var item in ConfigurationConstants.SupportedLocalization.Split(","))
        {
            supportedCultures.Add(new CultureInfo(item));
        }
        var localizationOptions = new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        };
        app.UseRequestLocalization(localizationOptions);

        var requestProvider = new RouteDataRequestCultureProvider();
        localizationOptions.RequestCultureProviders.Insert(0, requestProvider);
        var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
        app.UseRequestLocalization(locOptions.Value);
    }

    public static void ConfigureSwagger(this IServiceCollection services)
    {
        Dictionary<string, string> SwaggerPolicies = new Dictionary<string, string> { };

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "FM21 API", Version = "v1" });
            //c.OperationFilter<SwaggerCultureFilter>();
            //c.SchemaFilter<SwaggerExcludeFilters>();
            //c.SchemaFilter<SwaggerNotNullableFilter>();
            //c.SchemaFilter<AutoRestSchemaFilter>();
            //c.DocumentFilter<SwaggerSecurityTrimming>();
            c.EnableAnnotations();
            c.DescribeAllEnumsAsStrings();
            c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
            {
                In = ParameterLocation.Header,
                Description = "Please insert token with Bearer into field",
                Name = "Authorization",
                Type = SecuritySchemeType.ApiKey
            });

            c.AddSecurityRequirement(new OpenApiSecurityRequirement
            {
                {
                    new OpenApiSecurityScheme
                    {
                       Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "Bearer"}
                    },
                    SwaggerPolicies?.Keys.ToArray()
                }
            });
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            if (File.Exists(xmlPath))
            {
                c.IncludeXmlComments(xmlPath);
            }
        });
    }

    public static void AddSwagger(this IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseSwagger(c =>
        {
            c.RouteTemplate = "/swagger/{documentName}/swagger.json";
        });
        app.UseSwaggerUI(c =>
        {
            //c.RoutePrefix = "api"; 
            c.DocumentTitle = $"FM21 API: {env?.EnvironmentName}";
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "FM21 API v1");
            //string swaggerJsonBasePath = string.IsNullOrWhiteSpace(c.RoutePrefix) ? "." : "..";
            //c.SwaggerEndpoint($"{swaggerJsonBasePath}/swagger/v1/swagger.json", "FM21 Api v1");

            //c.DocumentTitle = $"App Api: {env?.EnvironmentName}"; 
            //c.SwaggerEndpoint($"../swagger/v1/swagger.json", "FM21 Api v1"); 
           // c.SwaggerEndpoint("/swagger/v1/swagger.json", "FM21 Api v1");
            c.DefaultModelExpandDepth(2);
            //c.DefaultModelRendering(ModelRendering.Example); ../
            //c.DefaultModelsExpandDepth(-1);
            //c.DisplayRequestDuration();
            c.DocExpansion(DocExpansion.None);
            c.EnableFilter();
            //c.ShowExtensions();
            c.EnableValidator();
        });
    }
}

}

ASP.NET Core
ASP.NET Core
A set of technologies in the .NET Framework for building web applications and XML web services.
4,553 questions
{count} votes

1 answer

Sort by: Most helpful
  1. Pradeep Kumar Gavuji 1 Reputation point
    2021-07-22T10:57:59.98+00:00

    Thank you for your reply, Actually the API's are called from the Angular app, on the first load of the Angular app calls the "GetCurrentUser()" method, which returns the "User.Identity.Name" along with the user details from the DB to the Angular App, I am able to get the "User.Identity.Name" when i run the application using "IIS Express", but User.Identity.Name" is returns NULL when i run the API project using project profile which uses Kestrel webserver.


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.