C# Owin自宿主WebApi Windows身份验证和匿名

C# Owin自宿主WebApi Windows身份验证和匿名,c#,asp.net-web-api,owin,windows-authentication,self-hosting,C#,Asp.net Web Api,Owin,Windows Authentication,Self Hosting,我有一个自托管的Owin WebAPI。我想用身份验证来保护一些路由。大多数路由都应该匿名访问。 我已经成功地实现了Windows身份验证,但是现在我在尝试访问标有[AllowAnonymous]的路由时,在匿名访问这些路由时,得到了401-未经授权的。如果我使用有效的凭据调用该方法,则一切正常 完美的解决方案是默认情况下允许匿名,并且仅当操作具有[Authorize]属性时才需要凭据 Owin配置 WinAuth中间件 榜样行动 您的问题是您将HttpListener配置为仅支持Windows

我有一个自托管的Owin WebAPI。我想用身份验证来保护一些路由。大多数路由都应该匿名访问。 我已经成功地实现了Windows身份验证,但是现在我在尝试访问标有
[AllowAnonymous]
的路由时,在匿名访问这些路由时,得到了
401-未经授权的
。如果我使用有效的凭据调用该方法,则一切正常

完美的解决方案是默认情况下允许匿名,并且仅当操作具有
[Authorize]
属性时才需要凭据

Owin配置 WinAuth中间件 榜样行动
您的问题是您将HttpListener配置为仅支持Windows身份验证。这类似于仅使用Windows身份验证配置IIS站点:对站点的每个请求都必须通过Windows身份验证

要有选择地激活身份验证,您需要通过将配置更改为此选项来同时允许Windows身份验证和匿名身份验证

public void Configuration(IAppBuilder appBuilder)
{
    // Enable Windows Authentification and Anonymous authentication
    HttpListener listener = 
    (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
    listener.AuthenticationSchemes = 
    AuthenticationSchemes.IntegratedWindowsAuthentication | 
    AuthenticationSchemes.Anonymous;

    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    appBuilder.Use(typeof(WinAuthMiddleware));
    appBuilder.UseWebApi(config);
}

这样做,您的标准[Authority]和[AllowAnymous]标记将按预期开始工作。

刚刚为我解决了这个问题。。有关详细信息,请参阅。感谢您提供的信息,它对我很有用!写一个答案,我会接受:)
public class WinAuthMiddleware : OwinMiddleware
{
    public WinAuthMiddleware(OwinMiddleware next) : base(next) {}
    public async override Task Invoke(IOwinContext context)
    {
        WindowsPrincipal user = context.Request.User as WindowsPrincipal;
        //..
    }
}
public class ValuesController : ApiController
{      
    [AllowAnonymous] // attribute gets ignored
    [Route("Demo")]
    [HttpGet]
    public string Get()
    {
        //..
    }
}
public void Configuration(IAppBuilder appBuilder)
{
    // Enable Windows Authentification and Anonymous authentication
    HttpListener listener = 
    (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
    listener.AuthenticationSchemes = 
    AuthenticationSchemes.IntegratedWindowsAuthentication | 
    AuthenticationSchemes.Anonymous;

    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    appBuilder.Use(typeof(WinAuthMiddleware));
    appBuilder.UseWebApi(config);
}