自托管 owin 应用程序中的混合授权(Windows NTLM 和匿名)不起作用 - “此请求的授权已被拒绝”

Posted

技术标签:

【中文标题】自托管 owin 应用程序中的混合授权(Windows NTLM 和匿名)不起作用 - “此请求的授权已被拒绝”【英文标题】:Mixed authorization (Windows NTLM & anonymous) in selfhosted owin application not working - "Authorization has been denied for this request" 【发布时间】:2019-04-05 21:14:27 【问题描述】:

我正在尝试开发自托管的 OWIN WebApp。一切正常,直到我尝试集成 Windows (NTLM) 身份验证。如果仅激活了 IntegratedWindowsAuthentication,则 Windows 身份验证工作正常。但我需要一些要求保持匿名。

我已经发现我必须启用这两种身份验证方法:

AuthenticationSchemes.IntegratedWindowsAuthentication | AuthenticationSchemes.Anonymous

但在这种情况下,我得到“此请求的授权已被拒绝”。使用 Chrome 作为客户端 (http://localhost:9009/api/test) 进行测试。

请帮忙。

OWIN 启动类:

public class Startup

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

        HttpConfiguration config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller"
        );
        appBuilder.UseWebApi(config);
    

主程序:

static void Main()
    
        string baseAddress = "http://localhost:9009/";

        // Start OWIN host 
        using (WebApp.Start<Startup>(url: baseAddress))
        
            Console.WriteLine("Server ready");
            Console.ReadLine();
        
    

测试控制器:

using System.Collections.Generic;
using System.Security.Principal;
using System.Web.Http;

namespace SelfhostNTAuth


public class TestController : ApiController

    [Authorize]
    public IEnumerable<string> Get()
    
        WindowsPrincipal user = RequestContext.Principal as WindowsPrincipal;

        if (user == null)
        
            return new string[]  "unauthorized";
        
        else
        
            return new string[]  user.Identity.AuthenticationType, user.Identity.Name ;
        
    


【问题讨论】:

【参考方案1】:

对我有用的是使用AuthenticationSchemeSelector 根据某些标准返回身份验证方案。

// Specify the authentication delegate.
listener.AuthenticationSchemeSelectorDelegate = 
    new AuthenticationSchemeSelector (AuthenticationSchemeForClient);
static AuthenticationSchemes AuthenticationSchemeForClient(HttpListenerRequest request)

    Console.WriteLine("Client authentication protocol selection in progress...");
    // Do not authenticate local machine requests.
    if (request.RemoteEndPoint.Address.Equals (IPAddress.Loopback))
    
        return AuthenticationSchemes.None;
    
    else
    
        return AuthenticationSchemes.IntegratedWindowsAuthentication;
    

【讨论】:

以上是关于自托管 owin 应用程序中的混合授权(Windows NTLM 和匿名)不起作用 - “此请求的授权已被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

OWIN 自主机中等效的会话变量

[翻译]自托管WebApi使用OWIN和Unity

使用 Ninject OWINHost 的 OWIN 自托管应用程序是不是需要 system.web?

ApiController 中长时间运行的任务(使用 WebAPI,自托管 OWIN)

OWIN 理解 ipv6 自托管的 URL 是啥?

OWIN 自托管静态网站