ASP.NET MVC5:在单个页面上关闭Windows身份验证

本文关键字:Windows 身份验证 单个页 NET MVC5 ASP | 更新日期: 2023-09-27 18:19:12

我的网站(ASP。NET MVC5与实体框架)使用Windows认证系统。它非常有用,使我能够通过搜索活动目录获得有关用户的更多信息。我可以自动填写表单字段的信息,如电子邮件,…

web . config:

[...]
<authentication mode="Windows" />
<authorization>
  <deny users="?" />
</authorization>
[...]

我有一个Powershell脚本(做另一项工作),必须访问网站的一个页面发送一些信息。我需要提供这种访问脚本,没有任何身份验证(关闭Windows身份验证仅用于此操作/页面)。我首先使用AllowAnonymous属性,它对没有影响

我的控制器:

[AllowAnonymous]
    public ActionResult ReceiveData(string scriptVersion, string content)
    {
        try
        {
            if (scriptVersion != null && content != null)
            {
                HttpUtility.UrlDecode(content);                    
                Xxxxx.UpdatexxxxxxServer(content); // I just replaced the name of my project
                return new HttpStatusCodeResult(200, "OK");
            }
            return new HttpStatusCodeResult(403, "You're not allowed to do this.");
        }
        catch(Exception e)
        {
            return new HttpStatusCodeResult(400, "Unable to execute this request on the DB. Detailed error: " + e.Message);
        }            
    }

Powershell脚本(仅供参考,不需要理解):

$url = "http://localhost:3349/Xxxxxx/ReceiveData"
$parameters = "scriptVersion=2&content=$([System.Web.HttpUtility]::UrlEncode($(Get-Content "$scriptFile")))"
$http_request = New-Object -ComObject Msxml2.XMLHTTP
$http_request.open('POST', $url, $false)
$http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
$http_request.setRequestHeader("Content-length", $parameters.length)
$http_request.setRequestHeader("Connection", "close")
$http_request.send($parameters)

当我的脚本到达send方法时,他要求我提供凭据,我不想每次都提供凭据(而且我不想把我的凭据放在脚本中)。这就是为什么我希望在此操作上禁用Windows身份验证。

我做了一些研究,试图找到任何可行的解决方案。我看到这个主题:MVC 5.0 [AllowAnonymous]和新的IAuthenticationFilterAllowAnonymous属性似乎不能在MVC5中工作,因为添加了新的过滤器。这就是为什么我尝试添加一个自定义过滤器:

public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter 
{        
    public void OnAuthentication(AuthenticationContext filterContext)
    {
    }
    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        var user = filterContext.HttpContext.User;
        if (user == null || !user.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

我将它添加到FilterConfig上,并将CustomAuthenticationAttribute放在我的Action ReceiveData上。没有更好的结果…所有的操作都在这个过滤器中进行,但是我不能在我的操作上禁用Windows身份验证。

我修改的动作:

[AllowAnonymous]
[CustomAuthenticationAttribute]
public ActionResult ReceiveData(string scriptVersion, string content) {
    [...]
}
我不是专家,如果你能帮我找到解决方案并理解它,那就太好了。提前感谢并为英语错误道歉,这不是我的母语。

ASP.NET MVC5:在单个页面上关闭Windows身份验证

我就是这么做的:

  1. 运行notepad作为admin
  2. 打开%WINDIR%'System32'inetsrv'config'applicationHost.config
  3. 保存为%WINDIR%'System32'inetsrv'config'applicationHost.config.bak用于备份
  4. 查找以下字符串:

    <section name="anonymousAuthentication" overrideModeDefault="Deny" />
    
  5. Deny替换为Allow
  6. 另存为%WINDIR%'System32'inetsrv'config'applicationHost.config
  7. 进入你的web应用程序文件夹
  8. 打开web.config
  9. 查找<configuration> section
  10. 粘贴到你的<configuration>部分:

    <!-- ANONYMOUS ACCESS FOR POWERSHELL SCRIPT -->
    <location path="ReceiveData.aspx">
        <system.webServer>
            <security>
                <authentication>
                    <anonymousAuthentication enabled="true" />
                </authentication>
            </security>
        </system.webServer>
    </location>
    
  11. 保存文件
  12. 回收应用程序池,以100%确定IIS重新读取web.config

更新:

我修改了.config文件。它只对本地IIS可用吗?

是的,这种方法使用IIS来配置匿名身份验证。我不能帮你写代码,因为我不是开发人员。也许你应该等真正懂c#的人来回答。

我必须在"非开发"环境中执行此更改吗?

是的,你必须改变%WINDIR%'System32'inetsrv'config'applicationHost.config中的全局设置,以便能够在每个应用程序web.config中覆盖anonymousAuthentication

关于代码:我用MVC工作,所以我没有任何。aspx页面。我将路径更改为MyController/ReceiveDate,是否正确?

<location path=>必须是"相对虚拟路径",即"脚本或当前请求路径的根相对虚拟路径"

我没有"回收应用程序池",因为我真的不知道如何我使用IIS Visual Studio。

不需要回收应用池,如果IIS检测到web.config更改,它应该自己回收它。但很少不发生或发生明显延迟。

用你的解决方案测试我的PowerShell脚本后,我得到一个错误500.19.

错误的HRESULT码是多少?也许你在web.config中打错了什么?有关详细信息,请参阅本文:打开IIS 7.0网页

时出现"HTTP Error 500.19"错误

除了location标签外,还要确保将runAllManagedModulesForAllRequests设置为true

web。允许访问测试文件夹的配置更改:

<configuration>
<system.web> 
        <authorization> 
            <allow users="*" />
            <deny users="?" />
        </authorization> 
</system.web> 
<location path="test”>
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication enabled="true" />
            </authentication>
        </security>
    </system.webServer>
</location>
<system.webServer>
     <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>

来源:在Windows认证保护的网站中设置公共页面