[英]ASP.NET MVC / Web API Custom Authentication
我有ASP.NET MVC 4 / Web API混合应用程序。 身份验证由现有应用程序处理。 在考虑保护这些类型的应用程序时,大多数文章都指向使用表单身份验证以及要保护的MVC和API控制器/操作的[Authorize]
属性。 我想使用[Authorize]
属性,因为它将处理MVC路由和API路由,但不知道如何在没有实际表单和使用内置成员资格提供程序的情况下执行此操作。
我应该采用这里描述的简单方法吗? 或者我应该创建一个处理逻辑的自定义成员资格提供程序?
为清楚起见,工作流程如下:
任何帮助将不胜感激。
如果您现有的登录门户使用表单身份验证,则可以在应用程序之间共享加密密钥,以便他们可以读取在登录门户中创建的身份验证cookie:
如何在Web表单和MVC2应用程序之间共享基于.net(C#)的身份验证会话?
如果您未在登录门户中使用表单身份验证,则可以保留现有进程,但添加手动创建身份验证cookie的步骤。 这方面有很多变化,但这个问题在问题中表现出更高层次的方式,在答案中表现出更低层次的方法:
这还要求应用程序之间的加密配置相同。
否则,您要么使用SSO协议进行切换。 您可以保留登录门户的现有身份验证过程,但需要添加其他代码以协调SSO切换到其他应用程序。 SSO的出现是因为除了上面#1和2中使用的加密cookie方法之外,还没有其他安全选项可用于执行浏览器重定向和通信身份验证。
创建自己的基于cookie的方法是有风险的,可能会打开您无法预见的安全漏洞。
这个例子的重要之处在于,不清楚用户名来自SetAuthCookie(username, ...
。这个问题暗示用户将登录到其他应用程序,该应用程序将查询Web服务以确定该登录是否是在这种情况下,它不是使用专用登录门户进行单点登录,而是每个应用程序收集登录信息并询问Web API是否有效。在您的情况下,您不希望收集每个门户中的登录信息,但是检测到他们已经登录到deicated登录门户。
所以问题是登录protal如何以安全的方式告诉你当你调用SetAuthCookie(username, ...
时username
是什么SetAuthCookie(username, ...
这正是SSO的用途。使用SSO切换,一个站点可以告诉另一个站点是安全的时尚,“我正在向你发送Bob123,你可以肯定它真的是Bob123而不是其他人。
选项#1和#2通过让登录门户设置cookie来解决这个问题,并通过在应用程序之间共享密钥,其他应用程序可以安全地读取该cookie。
请注意,您不能只使用任何cookie来执行此操作。 表单身份验证cookie以某种方式构建,以防止伪造cookie和其他篡改。
如果您跨越域,SSO将成为您唯一的选择,因为在一个域中编写的cookie无法在另一个域中读取(浏览器仅为当前域提交cookie)。
有多个子域共享根域的表单身份验证的解决方法:
有各种黑客用于重定向到具有加密信息的另一个站点,并让该站点编写表单身份验证cookie,但其中大多数只是与SSO一样复杂的可怕黑客。
您似乎尝试重新发明单点登录协议。 相反,您应该了解现有的SSO协议,如OAuth2或WS-Federation。
通常,SSO协议与您期望“工作流程”的行为类似。 确切的流程可能不同,但始终是身份提供程序对用户进行身份验证/验证,并且IdP以某种方式将此信息传递给使用它的应用程序(例如,应用程序发出自定义cookie以建立用户身份验证)。
Authorize
属性不适用于Forms身份验证。 设置请求生存期的主体的任何身份验证模块都可以替换Forms。 例如,会话认证模块现在经常被使用,因为它修复了Forms模块的一些特定问题(例如,无法持久存在长用户数据)。
如果你需要一本关于SSO的好书,请看看这里:
你可以使用Owin来处理这个问题。 这是我用于使用Facebook进行身份验证的代码段,它还使用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");
);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.