在 MVC 2 中验证 REST 请求

Posted

技术标签:

【中文标题】在 MVC 2 中验证 REST 请求【英文标题】:Authenticating REST requests in MVC 2 【发布时间】:2011-05-06 02:10:33 【问题描述】:

嘿,所以,在过去的几个小时里,我试图了解可以通过 asp.net MVC 提供的 RESTful 服务。身份验证仍然是我在互联网上找到的所有教程和指南中似乎没有涵盖的内容。

目前我们在现有的 MVC 应用程序中使用基于表单的身份验证。据我了解,我们需要添加基本 HTTP 身份验证才能处理连接到用户上下文的 REST 请求和用户权限。有没有办法在一个应用程序中“混合”这两种身份验证模式?

【问题讨论】:

【参考方案1】:

我不确定是否有任何内置功能,但您可以自己编写。比如:

var authHeader = Request.ServerVariables["HTTP_AUTHORIZATION"];
if (authHeader.StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase))

    var authParams = Encoding.Default.GetString(Convert.FromBase64String(authHeader.Substring("Basic ".Length)));
    var arr = authParams.Split(':');
    var username = arr[0];
    var password = arr[1];
   

如果您在 MVC 中编写自己的 REST 框架,您可以有一个基本的 Controller 类,并有一个与此类似的方法,该方法在每个操作之前运行以对调用者进行身份验证。

【讨论】:

嘿realworldcoder。是的,我目前的解决方案看起来像这样。我实现了一个自定义的 AuthorizeAttribute 来检查请求变量。我会尽快发布解决方案 =) 不错。如果您还没有,您可以在基本控制器的 OnActionExecuting() 方法中进行检查。【参考方案2】:

您可以轻松地将 ASP.NET 成员资格框架与 ASP.NET MVC RESTful 服务一起使用。请参阅以下链接以了解其使用 MVC RESTful 服务的实现。

http://msdn.microsoft.com/en-us/magazine/dd943053.aspx

如果您不了解会员框架,请使用以下链接

http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx

希望对你有帮助,谢谢

【讨论】:

嗨,Naveen,谢谢你。所以基本上客户端必须浏览整个 DOM 并在现有的登录表单上发布他的凭据,对吗?这对我来说似乎不是很 RESTful。有没有办法使用可以在请求标头中传递的凭据?【参考方案3】:

戴夫,

我明白你的意思。成员资格框架广泛使用 cookie 进行身份验证。您将凭据传递给服务器,服务器根据用户数据库验证它们并向您发出身份验证 cookie。下次每次调用 urs 时都会包含此身份验证 cookie,服务器使用该身份验证 cookie 来对用户进行身份验证和授权。现在,当您使用浏览器时,整个工作流程都可以无缝运行。

现在在您的场景中,您可以在控制器中创建一个用于验证凭据的操作。您可以在发布/获取数据中将凭据传递给此操作。您必须将身份验证 cookie 保存在您的代码中,并在每次调用服务器时将其包含在内。您可以覆盖 HttpWebRequest 类来执行这些步骤,并且可以在代码中使用相同的类。

如果这是一个很大的开销,并且您正在寻找类似 Web 服务之类的功能,我建议您查看 WCF 服务/Ado.NET 数据服务。这些与成员框架更无缝集成,可能更适合您的结果。

希望对你有帮助,谢谢。

【讨论】:

虽然所有这些都有效,但严格来说,cookie 可能会在调用之间保持会话状态,从而违反了 RESTful 原则。

以上是关于在 MVC 2 中验证 REST 请求的主要内容,如果未能解决你的问题,请参考以下文章

同时对 Asp.Net core 2.0 MVC 应用程序 (cookie) 和 REST API (JWT) 进行身份验证

Spring MVC REST + Spring Security + 基本身份验证

如何在 play framework 1.2.5 中验证 REST

如何验证 REST Lumen/Laravel 请求中的参数?

在 Spring MVC rest api 中实现用户认证

在rest api app中生成laravel请求验证的最佳实践