Asp.Net Core ne semble pas reconnaître l'utilisateur de l'appel context?.User?.Identity?.Name
Lorsque l'authentification Windows est activée et s'exécute dans IIS Express ou IIS.
Comportement souhaité: L'activation de l'authentification Windows et de l'authentification anonyme dans IIS et/ou IIS Express, Asp.Net Core devrait reconnaître automatiquement l'utilisateur Windows).
Comportement réel: lorsque j'active à la fois Windows et l'authentification anonyme dans IIS ou IIS Express, le nom d'utilisateur est nul. Lorsque je désactive l'authentification anonyme ou que j'appelle HttpContext.ChallengeAsync(IISDefaults.AuthenticationScheme)
, je reçois une invite de connexion, dont je ne veux pas.
Ma compréhension est que, même si je veux l'utiliser pour Active Directory, je n'ai pas besoin d'Active Directory ou d'un domaine pour authentifier un utilisateur Windows.
Environnement:
Dépendances:
Commencez:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<IISOptions>(iis =>
{
iis.AuthenticationDisplayName = "Windows";
iis.AutomaticAuthentication = true;
});
services.AddAuthentication(IISDefaults.AuthenticationScheme);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.Run(async (context) =>
{
await context.Response.WriteAsync(JsonConvert.SerializeObject(new
{
UserName = context?.User?.Identity?.Name
}));
});
launchSettings.json:
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:51682/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<remove name="aspNetCore" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore forwardWindowsAuthToken="true" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
</system.webServer>
</configuration>
applicationhost.config: (IIS Express)
Basé sur cet article: https://docs.Microsoft.com/en-us/iis/configuration/system.webServer/security/authentication/windowsAuthentication/
<authentication>
<anonymousAuthentication enabled="true" userName="" />
<basicAuthentication enabled="false" />
<clientCertificateMappingAuthentication enabled="false" />
<digestAuthentication enabled="false" />
<iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>
<windowsAuthentication enabled="true">
<providers>
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
Quelques choses:
Lorsque vous désactivez l'authentification anonyme, vous obtenez une fenêtre contextuelle car le navigateur ne fait probablement pas confiance au site. Vous devez ouvrir les Options Internet (à partir du Panneau de configuration de Windows) -> onglet Sécurité -> Cliquez sur "Sites de confiance" -> Cliquez sur "Sites" et ajoutez l'URL à votre site. Les deux IE et Chrome utilisent ces paramètres pour décider d'envoyer automatiquement vos informations d'identification).
Lorsque vous avez à la fois anonyme et l'authentification Windows activé, anonyme est prioritaire, sauf à l'endroit où vous lui dites que l'utilisateur doit être connecté. Pour ce faire, Utilisez le [Authorize]
attribut soit sur un contrôleur, soit uniquement sur des actions individuelles.
Plus de détails ici, sous la rubrique "Autoriser l'accès anonyme": https://docs.Microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-2.0&tabs=aspnetcore2x# autoriser l'accès anonyme