为了账号安全,请及时绑定邮箱和手机立即绑定

OWIN 托管的 web api:使用 windows 身份验证并允许匿名访问

OWIN 托管的 web api:使用 windows 身份验证并允许匿名访问

C#
杨__羊羊 2022-12-31 11:28:20
我有一个WebApi使用OWIN.我想对某些控制器的操作启用 Windows 身份验证,但允许匿名调用其他操作。因此,按照我在网上找到的一些示例,我在课堂上像这样设置了我的 WebApi Statrup:public void Configuration(IAppBuilder appBuilder){    HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];    listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication | AuthenticationSchemes.Anonymous; //Allow both WinAuth and anonymous auth    //setup routes and other stuff    //...    //Confirm configuration    appBuilder.UseWebApi(config);}然后,在我的控制器中,我创建了两个动作:[HttpGet][Authorize]public HttpResponseMessage ProtectedAction(){    //do stuff...}[HttpGet][AllowAnonymous]public HttpResponseMessage PublicAction(){    //do stuff...}然而,这是行不通的。调用标记的操作AllowAnonymous按预期工作,但调用标记的操作Authorize总是返回 401 错误和以下消息:{    "Message": "Authorization has been denied for this request."}即使调用者支持 windows 身份验证,在浏览器(Chrome 和 Edge)和 Postman 上进行了测试。我在这里错过了什么?
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

好吧,我在另一个问题中找到了解决方法。您可以通过设置 AuthenticationSchemeSelector 方法,在运行时为每个请求选择身份验证模式,而不是指定多个身份验证模式(这不起作用):


public void Configuration(IAppBuilder app)

{

    HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];

            listener.AuthenticationSchemeSelectorDelegate = new 

    AuthenticationSchemeSelector(GetAuthenticationScheme);

}


private AuthenticationSchemes GetAuthenticationScheme(HttpListenerRequest httpRequest)

{

    if(/* some logic... */){

        return AuthenticationSchemes.Anonymous;                    

    }

    else{

        return AuthenticationSchemes.IntegratedWindowsAuthentication;

    }

}

虽然不理想(您必须手动检查请求 URL 或请求的其他一些参数来决定使用哪种方法)但它可以工作。


查看完整回答
反对 回复 2022-12-31
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

由于您对问题的描述有限,我已经设置了一个演示应用程序,我在其中实现OAuthAuthorizationServerProvider为 Provider forOAuthAuthorizationServerOptions和 override GrantResourceOwnerCredentialsandValidateClientAuthentication


  public void Configuration(IAppBuilder app)

    {

        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions

        {

            Provider = new ApplicationOAuthBearerAuthenticationProvider()

        });

        app.Use<AuthenticationResponseMiddleware>();

        var options = new OAuthAuthorizationServerOptions

        {

            AllowInsecureHttp = true,

            TokenEndpointPath = new PathString("/api/xxxx"),

            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 

            Provider = new OwinAuthorisationProvider()


        };

        app.UseOAuthAuthorizationServer(options);


    }

还尝试AuthorizeAttribute在配置类中自定义并添加为过滤器.Filters.Add(new AuthorizeAttribute());


在AuthenticationResponseMiddleware我继承OwinMiddleware的public override async Task Invoke(IOwinContext context)方法中,请检查请求的流程。


它OAuthBearerAuthenticationProvider首先在RequestToken方法中命中,然后在OwinMiddleware类中命中,在进入任何 DelegatingHandler管道之前,大部分身份验证都是在此层中实现的。


检查后请评论您的发现,同时我也修改API并更新您,希望它可以帮助您。


查看完整回答
反对 回复 2022-12-31
  • 2 回答
  • 0 关注
  • 217 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信