【问题标题】:NetworkCredentials and Authorization in WebApiWeb Api 中的网络凭据和授权
【发布时间】:2013-06-13 09:23:22
【问题描述】:

我在尝试使用 WebClient 从示例控制台应用程序连接到 ASP.NET webapi 服务(我自己运行)时遇到了一些问题。 webapi 是 MVC4 的典型示例站点:

public HttpResponseMessage Get()
{
    return Request.CreateResponse(HttpStatusCode.OK, new string[] { "value1", "value2" });
}

Controller 用自定义的 Authenticate 属性装饰:

public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
    if (actionContext.Request.Headers.Authorization == null)
    {
        var response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        response.Headers.Add("WWW-Authenticate", "Basic realm=\"localhost\"");
        actionContext.Response = response;
        return;
    }
}

客户端代码是平常的:

 var wb = WebRequest.Create("http://localhost:64921/Values");
 wb.Credentials = new NetworkCredential("xxx", "xxx");

 var aaa = wb.GetResponse();
 Console.WriteLine(aaa);
 Console.ReadLine();

现在,我知道 WebClientWebRequest 在发送凭据之前应该等待 401,而这正是我在这里想要做的。

不用说上面的设置没有任何效果。我已经进入 IIS express 配置并更改了以下内容:

<basicAuthentication enabled="true" /> (in the security section)
<add name="BasicAuthenticationModule" lockItem="false" /> (in the modules section)

我遇到的问题是 401 甚至在服务器代码实际被命中之前就被返回了。我的意思是,如果我在控制器或属性中插入断点,它们就不会被命中。错误的详细信息是关于 error 401.2 的常见长文本,我认为这与 IIS 配置有关,但使用 IIS express 而不是好的 IIS 我没有一个好的 GUI 来解决这个问题.有人可以帮忙吗?

非常感谢!

【问题讨论】:

    标签: authentication asp.net-web-api webclient iis-express


    【解决方案1】:

    在 IIS 配置中,您已启用基本身份验证处理,因此如果没有凭据或凭据无效,IIS 将返回 401。

    如果您希望您的代码进行基本的身份验证处理,那么您需要告诉 IIS 允许匿名访问。

    从 cmets 编辑

    如果您要求 IIS 进行基本身份验证,它将根据 Windows 帐户检查凭据。这将在服务器代码运行之前起作用,因此不会命中自定义身份验证过滤器。在这种情况下,返回的标头将是正确的,您将看到 WebClient 执行双重请求(一个匿名,一个带有凭据)。如果 WebClient 不使用计算机或域帐户(对站点所在文件夹具有读取权限),则请求将失败。

    如果您想自己进行身份验证/授权,则需要告诉 IIS express 不要进行任何身份验证,然后自己进行所有操作...这基本上意味着将所有内容保留在配置中(在您的情况下,还原问题中显示的配置片段)并发送正确的标头,您已经这样做了。如果您调试,您将看到 Authenticate 过滤器被命中两次,第一次它将是匿名的,它将进入 if 并生成您的 HTTP 401 挑战响应,第二次它将具有标准 Basic 形式的凭据授权头:Basic &lt;BASE64_ENCODED_CREDENTIALS&gt;

    【讨论】:

    • 我该怎么做? IIS 在哪里可以获得凭据有效的信息?无论如何,我必须在代码中检查那些与数据库。无论如何,这是 IIS 表达的问题,我找不到如何将凭据放入我的代码,因为它总是发送 401。
    • @Tallmaris 我相信如果您要求 IIS 进行基本身份验证,它将检查 Windows 帐户。你需要告诉 IIS express 不要做任何身份验证,然后自己做。
    • @Tallmaris 只要确保如果您使用的是 .net 4,您已安装了 4.0.3 更新,否则您将无法设置 www-authenticate 标头。
    • 好吧,这开始有点意义了......基本上配置中的 BasicAuthentication 验证,正如你所说,Windows凭据。事实上,如果我使用我的机器用户和密码,我可以通过。所以我需要设置匿名身份验证并自己生成 401... 只需要查看 WebClient 是否可以识别并采取相应措施(发送第二个经过身份验证的请求)。
    • 宾果游戏,现在一切正常...感谢您为我指明了正确的方向。 :) 你介意我用我的所有发现编辑你的答案并在之后接受吗?
    猜你喜欢
    • 2017-12-29
    • 2014-11-20
    • 2018-08-22
    • 2014-05-24
    • 2014-01-04
    • 2012-03-12
    • 1970-01-01
    • 2018-05-21
    • 2017-12-09
    相关资源
    最近更新 更多