zoukankan      html  css  js  c++  java
  • Asp.Net WebApi 使用OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联” 异常的解决办法

    在Asp.Net WebApi 项目中使用OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常:

    出现错误。
    没有 OWIN 身份验证管理器与此请求相关联。
    ExceptionType:System.InvalidOperationException
    StackTrace:   在 System.Web.Http.Owin.PassiveAuthenticationMessageHandler.SuppressDefaultAuthenticationChallenges(HttpRequestMessage request)
    在 System.Web.Http.Owin.PassiveAuthenticationMessageHandler.<SendAsync>d__0.MoveNext()
    --- 引发异常的上一位置中堆栈跟踪的末尾 ---
    在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    在 System.Web.Http.HttpServer.<SendAsync>d__0.MoveNext()

    如果是英文版的VisualStudio,以上异常信息会是:No OWIN authentication manager is associated with the request

    原因是因为我们在Asp.Net WebApi项目使用了OWIN框架,但是没有指定OWIN框架使用的认证方式,而WebApi也禁用了默认的身份认证,所以到来的Http请求无法进行任何身份认证(意思就是匿名访问都不允许),抛出了异常。

    我们可以看到下面的OWIN框架Startup类的Configuration方法为空,没有为OWIN指定身份认证方式。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Owin;
    using Microsoft.Owin.Security;
    using Microsoft.Owin.Security.Cookies;
    using Owin;
    
    [assembly: OwinStartup(typeof(Daimler.CdnMgmt.Web.Startup))]
    
    namespace Daimler.CdnMgmt.Web
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                
            }
        }
    }

    解决方法有两个:

    第一:在OWIN的Startup类中指定默认的认证方式,我们将上面的Startup类代码改为下面的代码,在Configuration方法中为指定认证方式为Cookie认证。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Owin;
    using Microsoft.Owin.Security;
    using Microsoft.Owin.Security.Cookies;
    using Owin;
    
    [assembly: OwinStartup(typeof(Daimler.CdnMgmt.Web.Startup))]
    
    namespace Daimler.CdnMgmt.Web
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
                app.UseCookieAuthentication(new CookieAuthenticationOptions());
            }
        }
    }

    这样调用WebApi的相关Controller和Action就不会再抛出异常了。

    第二:在Asp.Net WebApi的全局配置文件WebApiConfig.cs中取消调用SuppressDefaultHostAuthentication方法,来启用Host的默认身份认证,如下代码所示。当然如果项目中本来就没有代码调用SuppressDefaultHostAuthentication方法,就不用考虑这个解决方法了。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Web.Http;
    using System.Web.Http.Cors;
    using Daimler.CdnMgmt.Web.Utils;
    using Microsoft.Owin.Security.OAuth;
    using Newtonsoft.Json.Serialization;
    
    namespace Daimler.CdnMgmt.Web
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                //config.SuppressDefaultHostAuthentication();//取消调用SuppressDefaultHostAuthentication方法,恢复Host的默认身份认证
    
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new {id = RouteParameter.Optional}
                );
            }
        }
    }

    当然如果你的ASP.NET项目中没有安装或者丢失了NuGet包:Microsoft.Owin.Host.SystemWeb,但是又使用了OWIN框架,也会出现本文所述的错误,只要重新安装NuGet包:Microsoft.Owin.Host.SystemWeb即可。

    详情还可以查看这个链接的帖子内容

  • 相关阅读:
    CF251D
    P6914
    CF1100F
    双连通 / 圆方树 胡扯笔记
    P4082
    SparkSql使用Hive中注册的UDF函数报类找不到问题解决
    Oracle 查询时使用时间作为where报错hour must be between 1 and 12
    【面试-python】
    Linux和Git
    AMBA初探
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/6900704.html
Copyright © 2011-2022 走看看