在Windows上运行的ASP.NET Core(2.1)中,我正在使用配置了以下身份验证方案的HttpSys:
builder.UseHttpSys(options =>
{
options.Authentication.Schemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM;
options.Authentication.AllowAnonymous = true;
})
然后在我的Startup.Configure()方法中,尝试访问客户端的用户凭据,该客户端调用uri“ / sensitiveOperation”如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
app.MapWhen(context => context.Request.Path.Equals("/sensitiveOperation") && context.Request.Method.Equals(HttpMethods.Put), subApp =>
{
subApp.Run(async (context) =>
{
if (context.User.Identity.Name == "admin")
{
await context.Response.WriteAsync("Performing sensitive operation.");
// .. Do Sensitive operation....
}
});
});
该示例有些粗俗,但要点是context.User.Identity.Name始终为空,我希望看到正在进行呼叫的AD帐户的名称。请注意,调用是在powershell中完成的,如下所示:
Invoke-WebRequest -Uri http://localhost:5555/sensitiveOperation -Method Put -UseDefaultCredentials
我可以将此代码放在控制器中,并使用[Authorize]属性获取凭据,但是我更喜欢在点击Mvc管道之前执行此操作。有什么方法可以让用户处于管道的早期阶段?
答案 0 :(得分:4)
更改AllowAnonymous
options.Authentication.AllowAnonymous = false;
如果您启用了匿名功能,并且不提示您进行身份验证,则浏览器将不会进行身份验证。即使您确实发送了创建的asp.net也不会获取它们,除非控制器/方法上具有Authenticate属性,或者如果您要执行功能路由,则需要调用signin。
答案 1 :(得分:1)
如果您不想将AllowAnonymous
设置为false
,则可以尝试context.ChallengeAsync
根据Credential
对请求进行身份验证。
下面是代码:
app.MapWhen(context => context.Request.Path.Equals("/sensitiveOperation") && context.Request.Method.Equals(HttpMethods.Put), subApp =>
{
subApp.Run(async (context) =>
{
var authService = context.RequestServices.GetRequiredService<IAuthorizationService>();
if (!context.User.Identity.IsAuthenticated)
{
//await context.ChallengeAsync("Windows"); //Option1
//await context.ChallengeAsync(); //Option2
await context.ChallengeAsync(HttpSysDefaults.AuthenticationScheme); //Option3
}
if (context.User.Identity.Name == "admin")
{
await context.Response.WriteAsync("Performing sensitive operation.");
// .. Do Sensitive operation....
}
});
});
注意,这样,subApp.Run
将运行两次,第一个请求未经身份验证,并且将挑战credentail,第二个请求经过身份验证,context.User.Identity.Name
将具有价值。此过程是后端的,不会反映在powershell
中。
答案 2 :(得分:1)
我使用的是.NET Core 3.0,在我的自定义中间件中,我可以使用以下代码获取UserId:
httpContext.User.Identity.IsAuthenticated
? new Guid(httpContext.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).First().Value)
: Guid.Empty