我已经在核心2.0中首次在.net核心中构建了我的api。客户端使用vs 2017角度模板构建。
我的api甚至被其他可能没有使用Windows身份验证的应用程序使用。对于那些我想允许匿名访问的功能。出于这个原因,我要启用Windows身份验证和匿名身份验证。
但是当启用两者时我知道我无法获得Windows用户名。在这种情况下,如何获取Windows用户名?
当我启用匿名身份验证以及Windows身份验证时,以下代码会中断。
[Route("current")]
public ADUser GetCurrentUser()
{
string accountUser = this.User.Identity.Name;
return new ADUser { Name = accountUser };
}
有人可以帮助我,他们是如何处理以下情况的。如果没有,有人可以告诉我如何在.net core 2.0中执行以下操作
答案 0 :(得分:2)
以下是我如何解决这个问题:
由于您希望允许匿名用户访问API的某些端点,因此您需要同时启用匿名身份验证和Windows身份验证。
作为旁注,您正确地说,[AllowAnonymous]
仅在启用Windows身份验证时无效,因为位于API前面的IIS将拒绝匿名请求。
现在启用了匿名身份验证,IIS默认情况下不会尝试对请求进行身份验证,因此无需进一步配置,就ASP.NET Core而言,所有请求都将是匿名的。
答案是向ASP.NET Core表明您希望尝试在每个请求上运行Windows身份验证过程。你可以这样做:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Other code omitted for brievity
// This sets the IIS authentication scheme as the default scheme
services.AddAuthentication(IISDefaults.AuthenticationScheme);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Other code omitted for brievity
// This includes the authentication middleware in the request pipeline
// It will try to authenticate every incoming request
app.UseAuthentication();
// MVC comes next, so the authentication will have taken place
// by the time your controller action is executed against the scheme
// used in AddAuthentication
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
现在控制器中有两种可能性:
User.Identity.IsAuthenticated
将返回true
User.Identity.IsAuthenticated
将获取值false
这意味着您可以对需要身份验证的特定操作使用[Authorize]
属性,或者将AuthorizeAttribute
全局添加到应用程序,并对可以执行的操作使用[AllowAnonymous]
匿名打电话。
答案 1 :(得分:1)
将以下内容添加到ConfigureServices
方法:
//使用Microsoft.AspNetCore.Server.IISIntegration;
services.AddAuthentication(IISDefaults.AuthenticationScheme)
对于要保护的API或操作控制器,使用[Authorize]
属性装饰它们,然后使用HttpContext.User.Identity.Name
获取登录用户。对要允许访问的操作使用[AllowAnonymous]
。
如果您想要保护并允许访问同一个api,那么您需要提供自己的授权过滤器实现。
有关详细信息,请查看此link