我整天都在为这个非常基本的问题而苦苦挣扎。长期来看,我试图保持.NETs Forms身份验证,但是用自定义模块替换默认的Authorization模块。
但是,在到达那里之前,我只需要调用自定义IHttpModule即可。
我将这段代码从网上复制下来作为基本模板开始使用:
public class UrlAuthorizationModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
}
void context_AuthenticateRequest(object sender, EventArgs e)
{
var sting = "";
}
void context_AuthorizeRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
if (context.Request.Url.AbsoluteUri.Contains("Oregon"))
return;
else
throw new UnauthorizedAccessException();
//if (context.User != null && context.User.Identity.IsAuthenticated)
//{
// HttpContext _httpContext = context.Context;
// SiteMapNode node = SiteMap.Provider.FindSiteMapNode(_httpContext);
// if (node == null)
// throw new UnauthorizedAccessException();
//}
}
public void Dispose()
{
}
}
然后我将其放入web.config:
<system.web>
<httpModules>
<remove name="UrlAuthorization" />
<add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
但是它根本没有被调用。没事然后我意识到我可能正在使用iis7,所以我添加了以下内容:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorization" />
<add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
<add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v17.2, Version=17.2.5.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A" name="ASPxHttpHandlerModule" />
不幸的是,一旦我在system.webServer / modules中添加“ add” customtag,那么该站点将根本无法加载。相反,它将引发通用500错误。
服务器错误
500-内部服务器错误。
您正在寻找的资源有问题,并且它 无法显示。
据我所知,我的语法都是正确的。 DevExpress定制模块正在正常工作,因此不会引发任何错误,因此我知道是我的添加引起了问题。如果我删除“添加”行,则该站点将正确加载,只是不会调用我的自定义IHttpModule。
系统日志中也没有显示任何内容。它一定是真的很愚蠢,我只是看不到。
编辑: 我在本地Win 10开发机器上使用Microsoft Visual Studio 2017(使用IISExpress)。我确实在以下位置找到了一些TraceLogFiles:C:\ Users \ username \ Documents \ IISExpress \ TraceLogFiles \ website \ fr000001.xml,里面就是这个错误。
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>
<EventID>0</EventID>
<Version>1</Version>
<Level>3</Level>
<Opcode>16</Opcode>
<Keywords>0x100</Keywords>
<TimeCreated SystemTime="2018-11-13T15:25:30.609Z"/>
<Correlation ActivityID="{80001795-0008-FD00-B63F-84710C7967BB}"/>
<Execution ProcessID="41168" ThreadID="40824"/>
<Computer>machine name</Computer>
</System>
<EventData>
<Data Name="ContextId">{80001795-0008-FD00-B63F-84710C7967BB}</Data>
<Data Name="ModuleName">IIS Web Core</Data>
<Data Name="Notification">1</Data>
<Data Name="HttpStatus">500</Data>
<Data Name="HttpReason">Internal Server Error</Data>
<Data Name="HttpSubStatus">19</Data>
<Data Name="ErrorCode">2147942433</Data>
<Data Name="ConfigExceptionInfo">\\?\C:\Users\username\Documents\websitepath\web.config ( 394) :Lock violation
</Data>
</EventData>
<RenderingInfo Culture="en-US">
<Opcode>MODULE_SET_RESPONSE_ERROR_STATUS</Opcode>
<Keywords>
<Keyword>RequestNotifications</Keyword>
</Keywords>
<freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>
<freb:Description Data="ErrorCode">The process cannot access the file because another process has locked a portion of the file.
(0x80070021)</freb:Description>
</RenderingInfo>
<ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
<EventGuid>{002E91E3-E7AE-44AB-8E07-99230FFA6ADE}</EventGuid>
</ExtendedTracingInfo>
</Event>
据我所知,它抱怨web.config文件被另一个进程锁定。但这没有意义。为了安全起见,我将正在使用的开发端口从使用的旧随机数更改为新的随机数,并且没有任何影响。考虑到该站点在没有自定义模块的情况下可以正常工作,这意味着web.config文件的基本权限是可以的。
答案 0 :(得分:0)
我设法在this post中找到了答案。
由于某些原因,模块内部的“删除”标签:
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorization" />
</modules>
不再在system.webServer内部。而且抛出的错误也不是很大。删除该标签(保留了两个自定义添加标签)后,该网站至少开始再次显示。
This post指向我指向我可以修改的applicationhost.config文件 $(solutionDir).vs \ config \ applicationhost.config
<add name="UrlAuthorizationModule" lockItem="true" />
并替换为
<add name="UrlAuthorizationModule" lockItem="false" />
然后,我能够在本地web.config中成功使用remove标签。
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorizationModule" />
</modules>