ASP.NET MVC / Web API自定义身份validation

我有ASP.NET MVC 4 / Web API混合应用程序。 身份validation由现有应用程序处理。 在考虑保护这些类型的应用程序时,大多数文章都指向使用表单身份validation以及要保护的MVC和API控制器/操作上的[Authorize]属性。 我想使用[Authorize]属性,因为它将处理MVC路由和API路由,但不知道如何在没有实际表单和使用内置成员资格提供程序的情况下执行此操作。

我应该采用这里描述的简单方法吗? 或者我应该创建一个处理逻辑的自定义成员资格提供程序?

为清楚起见,工作流程如下:

  1. 用户通过现有的身份validation门户登录。
  2. 如果经过身份validation,它们会被重定向到我的应用程序以及一些其他数据,例如用户名和电子邮件(因此不需要传输密码)
  3. 我的应用程序设置了一个允许用户继续使用该应用程序的身份validationcookie。

任何帮助将不胜感激。

  • 选项1

如果您现有的登录门户使用表单身份validation,则可以在应用程序之间共享加密密钥,以便他们可以读取在登录门户中创建的身份validationcookie:

如何在Web表单和MVC2应用程序之间共享基于.net(C#)的身份validation会话?

  • 选项2

如果您未在登录门户中使用表单身份validation,则可以保留现有进程,但添加手动创建身份validationcookie的步骤。 这方面有很多变化,但这个问题在问题中表现出更高层次的方式,在答案中表现出更低层次的方法:

如何手动创建身份validationcookie而不是默认方法?

这还要求应用程序之间的加密配置相同。

  • 选项3

否则,您要么使用SSO协议进行切换。 您可以保留登录门户的现有身份validation过程,但需要添加其他代码以协调SSO切换到其他应用程序。 SSO的出现是因为除了上面#1和2中使用的加密cookie方法之外,还没有其他安全选项可用于执行浏览器重定向和通信身份validation。

创建自己的基于cookie的方法是有风险的,可能会打开您无法预见的安全漏洞。

  • “我应该采用这里描述的简单方法吗?”

这个例子的重要之处在于,不清楚用户名来自SetAuthCookie(username, ... 。这个问题意味着用户将登录到其他应用程序,该应用程序将查询Web服务以确定该登录是否是在这种情况下,它不是使用专用登录门户进行单点登录,而是每个应用程序收集登录信息并询问Web API是否有效。在您的情况下,您不希望收集每个门户中的登录信息,但是检测到他们已经登录到deicated登录门户。

所以问题是登录protal如何以安全的方式告诉你当你调用SetAuthCookie(username, ...username是什么SetAuthCookie(username, ...这正是SSO的用途。使用SSO切换,一个站点可以告诉另一个站点是安全的时尚“我正在向你发送Bob123,你可以确定它真的是Bob123而不是其他人。

选项#1和#2通过让登录门户设置cookie来解决这个问题,并通过在应用程序之间共享密钥,其他应用程序可以安全地读取该cookie。

请注意,您不能只使用任何cookie执行此操作。 表单身份validationcookie以某种方式构建,以防止伪造cookie和其他篡改。

如果您跨越域,SSO将成为您唯一的选择,因为在一个域中编写的cookie无法在另一个域中读取(浏览器仅为当前域提交cookie)。

有多个子域共享根域的表单身份validation的变通方法:

正确创建跨域表单身份validationcookie

有各种黑客用于重定向到具有加密信息的另一个站点,并让该站点编写表单身份validationcookie,但其中大多数只是与SSO一样复杂的可怕黑客。

您似乎尝试重新发明单点登录协议。 相反,现有的SSO协议,如OAuth2或WS-Federation,您一定要了解。

通常,SSO协议与您期望“工作流程”的行为类似。 确切的流程可能不同,但始终是身份提供程序对用户进行身份validation/validation,并且IdP以某种方式将此信息传递给使用它的应用程序(例如,应用程序发出自定义cookie以建立用户身份validation)。

Authorize属性不适用于Forms身份validation。 设置请求生存期的主体的任何身份validation模块都可以替换Forms。 例如,会话认证模块现在经常被使用,因为它修复了Forms模块的一些特定问题(例如,无法持久存在长用户数据)。

如果你需要一本关于SSO的好书,请看看这里:

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

你可以使用Owin来处理这个问题。 这是我用于使用Facebook进行身份validation的代码段,它还使用cookie:

 using Microsoft.AspNet.Identity; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Owin; namespace ASPNetMVC53rdPartyAuth { public partial class Startup { public void ConfigureAuth(IAppBuilder app) { // Enable the application to use a cookie to store information for the signed app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") }); // Use a cookie to temporarily store information about a user logging in with a // third party login provider app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // third party login providers: // You have to register this app at https://developers.facebook.com/ and get the //appId and appSecret. // Facebook requires SSL, so that need to be enanbled. Project url can be found // under project properties and can be localhost. app.UseFacebookAuthentication( appId: "xxxxxxxxxxxxxxxx", appSecret: "xxxxxxxxxxxxxxxx"); ); } } }