c# - Owin 自托管 WebApi Windows 身份验证和匿名

标签 c# asp.net-web-api owin windows-authentication self-hosting

我有一个自托管的 Owin WebAPI。我想通过身份验证保护一些路由。大多数路线应该可以匿名访问。 我已成功实现 Windows-Auth,但现在我在尝试匿名访问标有 [AllowAnonymous] 的路由时得到 401 - Unauthorized。如果我使用有效凭据调用该方法,一切正常。

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

欧文配置

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

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

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

WinAuth Owin中间件

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()
    {
        //..
    }
}

最佳答案

您的问题是您将 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);
}

这样做,您的标准 [Authorize] 和 [AllowAnymous] 标签就会开始按预期工作。

关于c# - Owin 自托管 WebApi Windows 身份验证和匿名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45299525/

相关文章:

entity-framework - ASP.NET OData - 使用带有数据传输对象的 Delta<T> 实现 PATCH

c# - 调用质询时未应用身份验证属性中传递的 RedirectUri

c# - 为可枚举的c#分配内存

c# - 寻找更好的方法来处理大量参数

javascript - 对丢弃的 http 连接进行重复处理

c# - 为什么 AsyncLocal 不从 OWIN 中间件流向 WebForms 页面?

asp.net-mvc - 将 OAuth 不记名 token (JWT) 与 MVC 结合使用

c# - 如何为 mscorlib 创建外部别名

c# - 我如何播放音频并匹配文本框中的所有文本

asp.net-mvc - Web API 2 中具有 MVC 5 AttributeRouting 的 QueryString