【问题标题】:ASP.NET MVC / Web API Custom AuthenticationASP.NET MVC / Web API 自定义身份验证
【发布时间】:2014-05-21 18:44:16
【问题描述】:

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

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

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

  1. 用户通过现有的身份验证门户登录。
  2. 如果通过身份验证,它们会连同用户名和电子邮件等其他一些数据一起重定向到我的应用程序(因此无需传输密码)
  3. 我的应用程序设置了一个身份验证 cookie,允许用户继续使用该应用程序。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc authentication asp.net-web-api


    【解决方案1】:
    • 选项 1

    如果您现有的登录门户使用表单身份验证,那么您可以在应用程序之间共享加密密钥,以便它们可以读取在登录门户中创建的身份验证 cookie:

    How can I share .net (C#) based authenticated session between web forms and MVC2 applications?

    • 选项 2

    如果您没有在登录门户中使用表单身份验证,则可以保留现有流程,但添加一个手动创建身份验证 cookie 的步骤。对此有很多变化,但这个问题在问题中显示了更高级别的方法,而在答案中显示了较低级别的方法:

    How can I manually create a authentication cookie instead of the default method?

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

    • 选项 3

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

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

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

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

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

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

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

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

    有多个子域共享一个根域的表单身份验证的解决方法:

    Proper creation of a cross-domain forms authentication cookie

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

    【讨论】:

    • 哇,感谢您非常全面的回答。我认为选项 1 和 2 不适合我,所以就像你和@Wiktor 提到的那样,我需要研究 SSO。你能推荐任何关于 SSO 移交的好文章、博客、stackoverflow 帖子等吗?
    【解决方案2】:

    您可以使用 Owin 来处理这个问题。这是我用来通过 Facebook 进行身份验证的代码 sn-p,它也使用 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");
             );           
          }
        }
    }
    

    【讨论】:

      【解决方案3】:

      您似乎试图重新发明单点登录协议。相反,您绝对应该了解现有的 SSO 协议,例如 OAuth2 或 WS-Federation。

      一般来说,SSO 协议的工作方式与您期望的“工作流程”的表现类似。确切的流程可能有所不同,但这始终是身份提供者对用户进行身份验证/授权,并且 IdP 以某种方式将此信息传递给使用它的应用程序(例如,应用程序发出自定义 cookie 来建立用户身份验证)。

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

      如果您需要一本关于 SSO 的免费书籍,请看这里:

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

      【讨论】:

      • 感谢您的意见。我对 SSO 很熟悉,但不幸的是,我无法控制现有的身份验证应用程序,而且我似乎需要一个自定义解决方案(即使它可能是重新发明轮子)来处理他们现有的身份验证应用程序。
      • 您可以让现有的应用程序处理身份验证,但对于您问题中的第 2 步,请使用 SSO 切换到其他应用程序。
      • 感谢本书的链接。那里有很多很好的信息。
      猜你喜欢
      • 2016-05-06
      • 2018-03-15
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2014-06-02
      • 2015-03-22
      • 2013-09-06
      相关资源
      最近更新 更多