Owin搭配Identity 2.0加载默认文档报401.2访问被拒绝如何解决
问题解决方案:.NET Framework 4.8迁移Identity 2.0后目录路径访问401.2错误
根因说明
该错误由IIS请求处理顺序导致:IIS默认文档解析模块的执行优先级高于ASP.NET Identity认证管道。当你访问不带具体文件名的目录路径时,IIS会先校验访问权限,此时匿名认证已关闭,且还未触发ASP.NET Identity的登录态校验,IIS直接判定请求未授权,返回401.2错误。而带具体.aspx后缀的请求会直接进入ASP.NET托管管道,Identity可正常识别已登录用户的Cookie信息,因此访问正常。
可行解决方案(均无需开启目录匿名访问)
方案1:调整UrlAuthorization模块执行规则(推荐)
修改web.config配置,移除UrlAuthorizationModule的托管请求预条件,让该授权模块可以处理目录类非托管路径请求,适配Identity的认证逻辑:
<configuration> <system.webServer> <modules> <!-- 移除原有默认的UrlAuthorization模块配置 --> <remove name="UrlAuthorization" /> <!-- 重新添加模块,清空preCondition使其处理所有类型的请求 --> <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="" /> </modules> <!-- 保持你原有的默认文档配置即可 --> <defaultDocument enabled="true"> <files> <add value="default.aspx" /> </files> </defaultDocument> </system.webServer> </configuration>
该方案对原有业务逻辑无侵入,配置即可生效。
方案2:全局路径重写
如果方案1不生效,可在项目的Global.asax文件中添加请求路径重写逻辑,自动把目录结尾的请求映射到对应目录下的default.aspx页面,让请求直接进入ASP.NET托管管道:
void Application_BeginRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; string requestPath = app.Request.Path; // 匹配以/结尾的目录请求 if (requestPath.EndsWith("/") && !requestPath.Equals("/")) { string defaultPagePath = requestPath + "default.aspx"; // 确认默认页面存在后再重写路径 if (System.IO.File.Exists(app.Server.MapPath(defaultPagePath))) { app.Context.RewritePath(defaultPagePath); } } }
原有配置校验
你当前的<authentication mode="None"/>配置符合Identity 2.0的使用要求,无需修改;全局<authorization><deny users="?"/></authorization>的权限控制规则也可正常保留。
内容的提问来源于stack exchange,提问作者WillM
相关产品推荐
相关产品推荐

