我有ASP.NET MVC 4/ Web混合应用程序。身份验证由现有应用程序处理。在保护这些类型的应用程序时,大多数文章都指向使用表单身份验证以及您想要保护的MVC和API控制器/操作上的[Authorize]
属性。我想使用[Authorize]
属性,因为它将同时处理MVC路由和API路由,但不确定如何在没有实际表单和使用内置成员提供程序的情况下这样做。
我应该使用一种简单的方法,如描述的here吗?还是应该创建一个处理逻辑的自定义成员资格提供程序?
为了清楚起见,工作流程如下:
任何帮助都将不胜感激。
发布于 2014-04-08 22:30:49
如果您现有的登录门户使用的是窗体身份验证,那么您可以在应用程序之间共享加密密钥,以便它们能够读取在登录门户中创建的身份验证cookie:
How can I share .net (C#) based authenticated session between web forms and MVC2 applications?
如果在登录门户中不使用窗体身份验证,则可以保留现有流程,但可以添加手动创建身份验证cookie的步骤。在这个问题上有很多不同的地方,但这个问题在问题中表现出了更高层次的方式,而在回答中则表现出了一个较低层次的方法:
How can I manually create a authentication cookie instead of the default method?
这还要求应用程序之间的加密配置是相同的。
否则,您要么使用SSO协议进行切换。您可以保留登录门户的现有身份验证过程,但需要添加其他代码来协调SSO切换到其他应用程序。SSO之所以出现,是因为除了上面#1 &2中使用的加密cookie方法之外,几乎没有其他安全选项可用于执行浏览器重定向和通信身份验证。
创建您自己的基于cookie的方法是有风险的,并且可能会打开您没有预见到的安全漏洞。
这个例子的重要之处在于,还不清楚用户名在SetAuthCookie(username, ...
中来自何处。这个问题意味着用户将登录到该附加应用程序,该应用程序将查询web服务以确定该登录是否有效。在这种情况下,它不是单独登录一个专用的登录门户,而是每个应用程序收集登录信息,并询问web是否有效。在您的示例中,您不希望在每个门户中收集登录信息,而是检测它们已经登录到已删除的登录门户。
因此,问题在于登录产品如何以安全的方式告诉您,当您调用username
时,SetAuthCookie(username, ...
是什么。这正是SSO的作用所在。使用SSO切换,一个站点可以以安全的方式告诉另一个站点:“我将Bob123发送给您,您可以确定这是真的Bob123,而不是其他人。
选项1和#2可以通过让登录门户设置cookie来解决这个问题,通过在应用程序之间共享密钥,其他应用程序可以安全地读取该cookie。
注意,你不能用任何饼干来做这件事。表单身份验证cookie是以某种方式构建的,以防止cookie的伪造和其他篡改。
如果要跨域访问,SSO将成为您的唯一选择,因为在一个域中编写的cookie不能在另一个域中读取(浏览器只提交当前comain的cookie)。
通过共享根域的多个子域,表单身份验证有一些解决办法:
Proper creation of a cross-domain forms authentication cookie
使用加密信息重定向到另一个站点并让该站点编写表单身份验证cookie的黑客有很多种,但其中大多数都是可怕的黑客,与SSO一样复杂。
发布于 2014-04-08 20:56:08
你似乎试图重新发明一个单一的登录协议。相反,有一些现有的单点登录协议,如OAuth2或,您肯定应该了解这些协议。
通常,SSO协议的工作方式类似于您期望的“工作流”行为。确切的流程可能不同,但这始终是身份提供者对用户进行身份验证/授权,而IdP以某种方式将此信息传递给使用该信息的应用程序(例如,应用程序发出自定义cookie来建立用户身份验证)。
Authorize
属性不打算仅用于窗体身份验证。任何为请求生存期设置主体的身份验证模块都可以替换表单。例如,会话身份验证模块现在经常被使用,因为它解决了表单模块的一些特殊问题(例如,无法持久化长用户数据)。
如果您需要一本关于SSO的免费好书,请看这里:
http://msdn.microsoft.com/en-us/library/ff423674.aspx
发布于 2014-04-08 21:22:22
你可以用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");
);
}
}
}
https://stackoverflow.com/questions/22947735
复制相似问题