Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务

Posted

技术标签:

【中文标题】Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务【英文标题】:Microsoft MVC 4, APIController and a proper RESTful login Web Service 【发布时间】:2012-03-28 13:03:45 【问题描述】:

我使用 Microsoft ASP.NET MVC 4 ApiController 制作了一个简单的 RESTful Web 服务(目前仅支持 GET)。

现在我正在寻找为服务实施授权系统的正确方法。我知道我不想使用内置的FormsAuthentication,因为我不想让所有使用我的 WS 的应用程序都有一个唯一的登录页面;此外,这打破了 RESTful 范式,强制重定向并且不使用正确的401 状态代码通知客户端。

所以我禁用了FormsAuthentication,从我的web.config 中删除以下行:

<authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

并添加以下内容:

<modules runAllManagedModulesForAllRequests="true">
    <remove name="FormsAuthentication" />
</modules>

我已经有一个用于管理用户登录的ApiController,它主要根据我的数据库检查凭据并返回用户,如果凭据无效则返回401

我读到我必须实现MembershipAuthorization API,但我发现没有什么可以帮助我从头开始做。 你有什么想法?我是否需要管理数据库上的 cookie 和 authcode,或者是否有类似于 FormsAuthentication 的类来为我做这件事?

【问题讨论】:

【参考方案1】:

您可以编写custom message handler 来处理身份验证。 Dominick Baier 写了一篇出色的 series of blog posts,其中深入探讨了细节。

【讨论】:

【参考方案2】:

我找到了解决方案,我基本上只是使用了 Microsoft 的example 中显示的解决方法。

    创建一个名为 App_Start 的文件夹。 将two classes 放入适当的命名空间。 FormsAuthentication 和添加的请求/响应处理系统将完成剩下的工作。

由于我不喜欢 401 响应中的“内容已移至此处”,因此我以这种方式编辑了 OnEndRequest 方法:

private void OnEndRequest(object source, EventArgs args)
    
        var context = (HttpApplication)source;
        var response = context.Response;

        if (context.Context.Items.Contains("__WEBAPI:Authentication-Fixup"))
        
            response.StatusCode = (int)context.Context.Items[FixupKey];
            response.RedirectLocation = null;
            // Clear the page content, since I don't want the "Content moved here." body
            response.ClearContent();
        
    

参考资料:

http://netmvc.blogspot.it/2012/03/aspnet-mvc-4-webapi-authorization.html

【讨论】:

【参考方案3】:

查看此project on github。他们开发了一些带有示例的类,用于向 ASP.NET Web API 添加安全性。支持的安全模型之一是基本身份验证,这似乎是您在问题中描述的内容。

【讨论】:

看来我需要第一个示例,BasicAuthentication。但是我还不知道是否有办法将授权码(我不会将用户名和密码作为授权码发送给客户端)存储在数据库中。 我不确定我是否理解您所说的“存储身份验证码的方法”是什么意思。您对授权码的描述是什么。使用基本身份验证,您希望对发送过来的用户名/密码进行编码,并在另一端对其进行解码。您还想使用带有基本身份验证的 HTTPS/SSL/TSL 来加密网络上的整个消息。在数据库中存储密码时,我总是对存储的密码使用一种加密方式。然后在比较数据库中的内容之前,对用户输入的密码使用相同的加密。 我想为每个登录创建一个临时验证码并将其存储在数据库中。我认为这与 FormsAuthentication 所做的相同:它创建了一个与登录用户严格链接的会话授权代码。 让我更好地解释一下:如果我下载 Microsoft 的 this sample project 并启动 Web 应用程序,在第一次注册时,它会自动创建一个包含用户数据的默认数据库。然后,当我登录时,Web 应用程序会设置一个名为 .ASPXAUTH 的 cookie,每次我注销时都会有所不同。这意味着服务器不会根据用户名和密码检查 cookie 值,而是根据存储的值。我想使用已有的 User 表来实现同样的目的。 我相信你描述的是令牌认证,我之前提到的库中也支持。在这篇文章中有一个很好的讨论,关于使用这种方法的注意事项 [***.com/questions/1432664/…。基本上,您需要为登录创建 Web 服务方法,该方法返回一个令牌(身份验证码)供客户端用于任何进一步的服务调用。使用此方法时,您确实需要在 authcode 中添加超时。

以上是关于Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft MVC 4、APIController 和适当的 RESTful 登录 Web 服务

无法从 C:\ 创建分析器 Microsoft.AspNetCore.Mvc.Analyzers.AvoidHtmlPartialAnalyzer 的实例

从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

MVC4 未处理异常:Microsoft JScript 运行时错误

Azure Functions Swashbuckle:在重建期间无法解析程序集“Microsoft.AspNetCore.Mvc.Core”

尝试激活“Student.Controllers.MyController”时无法解析“Microsoft.AspNetCore.Mvc.ActionContext”类型的服务