web api中的基本身份验证

时间:2013-04-09 10:12:12

标签: authentication basic-authentication asp.net-web-api

我开始研究Web Api,只想创建一个简单的基本身份验证。我想知道怎么做?

我尝试使用给定的MSDN链接,但在MSDN上没有给出逐步教程。 http://www.asp.net/web-api/overview/security/basic-authentication

3 个答案:

答案 0 :(得分:34)

您提供的链接提供了您需要的大部分细节,我希望这填补了空白。

注意:如果使用Web.API 2,Microsoft建议使用authentication filters采用不同的方法。

在您的服务器上设置https

如果您需要真正的安全性,这一点非常重要,否则可以通过窥探方收集密码。如何执行此操作完全取决于您的设置,您没有详细说明,但如果您正在使用Azure WebRole,则Microsoft的step-by-step guide to setting up SSL非常好。

下一步不需要这样做,但应在发布代码之前完成。我首先提到它是因为这部分通常涉及让其他人参与(服务器配置的系统管理员,购买证书的财务等),并且给他们很多警告是很好的。

编写(或窃取)自定义IHttpModule以进行身份​​验证

这是C#代码in your link的一大块 - 它解析浏览器发送的值并将HttpContext.Current.User设置为经过身份验证的用户。只需将肉类复制并粘贴到您自己的应用程序中的类中,我们稍后再回过头来。您需要在代码中使用以下语句。

using System; using System.Net.Http.Headers; using System.Security.Principal;
using System.Text; using System.Threading; using System.Web;

将该模块与您的应用程序相关联

在web.config文件中添加一个新模块(注意system.webServer可能已存在)

<system.webServer>
  <modules>
    <add name="BasicAuth" type="Full.ClassName.Path.BasicAuth, Assembly.Name"/>
  </modules>
</system.webServer>

限制访问您网站的相关部分

您可以通过在操作定义之前添加[Authorize]属性来阻止特定操作。通过在控制器类之前添加控制器来阻止整个控制器。

[Authorize] // Restricts access to whole controller    
public class StockController : ApiController {
    [Authorize] // Restricts access to this action - not necessary if whole controller restricted.
    public IEnumerable<StockLevel> Get() {

或者在App_Start \ WebApiConfig.cs文件中,您可以添加config.Filters.Add(new AuthorizeAttribute());,它会锁定所有内容。

需要注意的事项 - 还有一个System.Web.Mvc.AuthorizeAttribute因此,如果你包含了这个名称空间,你可能会得到令人困惑的结果。

此时你可以尝试一下 - 用户:“用户”,传递:“密码”。

自定义用户验证

回到我们从链接中窃取的课程,您将看到以下代码块:

// TODO: Here is where you would validate the username and password.
private static bool CheckPassword(string username, string password)

如果用户名和密码有效,请将此项返回true。如果你自己推出,可能需要调查bcrypt(你相信你从网上下载的实现吗?),PBKDF2Crypto class(简单但不是非常安全)但是微软可能会有更好的东西,因为有很多关于正确存储密码的担忧。

答案 1 :(得分:1)

我必须在MSDN示例中添加几行代码才能使其正常工作。具体来说,在OnApplicationAuthenticateRequest()中,如果无法验证用户,我将响应状态代码设置为401:

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var request = HttpContext.Current.Request;
            var authHeader = request.Headers["Authorization"];
            bool validated = false;
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                                                StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                {
                    validated = AuthenticateUser(authHeaderVal.Parameter);
                }
            }

            if (!validated)
            {
                HttpContext.Current.Response.StatusCode = 401;
            }
        }

一旦我做到了,它运作良好。可能有更好的方法来构建逻辑,但这是关于完成工作的示例中最小的变化。

答案 2 :(得分:1)

要在每个控制器或每个方法的基础上有选择地启用基本身份验证,您可以按this question中所述从AuthorizeAttribute派生。