按照本指南中的步骤操作,使用 Azure ACS,我配置了一个有效的 Azure ACS 服务并通过 Facebook 进行身份验证,重定向回我的开发服务器上运行的网站。
身份验证成功后,Azure ACS 重定向回我的本地开发网站,并且 IsAuthenticated 标志为 true,但是,仅当来自声明的电子邮件也存在于我的本地数据库中时,我才希望通过检查/调用自定义成员资格提供程序将 IsAuthenticated 标志设置为 true。如果来自索赔的电子邮件不存在,我想将客户端重定向到注册页面。注册并经过身份验证后,我想将 IsAuthenticated 标志设置为 true。
目前,一旦通过Facebook和AzureACS的身份验证,用户可以请求一个安全页面,如ViewAccountBalance.aspx,即使该帐户不存在,因为开箱即用的IsAuthentication标志为true。有兴趣听听其他人做了什么以及最佳实践是什么。
您需要明确区分身份验证和授权。由于用户通过Facebook登录,这意味着他已经过身份验证(你知道他是谁以及他来自哪里)。
现在,如果您想根据特定条件限制应用程序的某些部分,您实际上是在谈论授权。您可以考虑将角色与简单的 HttpModule 组合在一起。示例:您的 HttpModule 可以验证用户正在浏览哪个页面。如果用户访问需要活动配置文件的页面,则可以使用以下代码:
public class RequiresProfileHttpModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new EventHandler(OnAuthorize);
}
private void OnAuthorize(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if (app.Request.Url.ToString().Contains("bla") && !app.Context.User.IsInRole("UsersWithProfile"))
app.Response.Redirect("http://myapp/register.aspx");
}
}
您唯一需要注意的是更新主体,以确保如果用户填写了他的电子邮件地址,则它具有角色 UsersWithProfile。
这只是众多可能的解决方案之一。如果您使用的是 ASP.NET MVC,则可以使用全局 ActionFilters 获得相同的结果。或者,您也可以尝试使用 IClaimsPrincipal(如果用户有配置文件,请添加声明)。
桑德里诺是正确的。可以使用基于角色的授权(或更一般地说,基于声明的授权)。默认情况下,ACS 只是将标识提供者颁发的声明返回给信赖方。对于Facebook,它将返回电子邮件声明。但是,您可以配置 ACS 以创建其他规则。例如,可以将特定用户映射到值为管理员的角色。然后,ACS 还会将此角色声明返回到信赖方。然后,您可以使用Sandrino的建议来使用基于角色的授权。您还可以参考 http://msdn.microsoft.com/en-us/library/windowsazure/gg185915.aspx 了解更多信息。