1

按照本指南中的步骤使用 Azure ACS,我通过 Facebook 配置和验证了一个可用的 Azure ACS 服务,重定向回在我的开发服务器上运行的网站。

身份验证成功后,Azure ACS 将重定向回我的本地开发网站,并且 IsAuthenticated 标志为真,但是我想仅当来自声明的电子邮件也存在于我的本地数据库中时,通过检查/调用将 IsAuthenticated 标志设置为真自定义 MembershipProvider。如果索赔中的电子邮件不存在,我想将客户重定向到注册页面。一旦注册并通过身份验证,我想将 IsAuthenticated 标志设置为 true。

目前,一旦通过 Facebook 和 AzureACS 进行身份验证,用户就可以请求安全页面,例如 ViewAccountBalance.aspx,即使该帐户不存在,因为开箱即用的 IsAuthenticated 标志为 true。有兴趣了解其他人做了什么以及最佳实践是什么。

4

2 回答 2

0

桑德里诺是正确的。您可以使用基于角色的授权(或更一般地说,基于声明的授权)。默认情况下,ACS 只是将身份提供者发出的声明返回给您的依赖方。对于 Facebook,它将返回电子邮件声明。但是,您可以配置 ACS 以创建其他规则。例如,您可以将特定用户映射到值为管理员的角色。然后 ACS 也会将此角色声明返回给您的依赖方。然后您可以使用 Sandrino 的建议来使用基于角色的授权。您还可以参考http://msdn.microsoft.com/en-us/library/windowsazure/gg185915.aspx了解更多信息。

于 2012-04-18T09:40:53.567 回答
0

您需要明确区分身份验证和授权。由于用户通过 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(如果用户有个人资料,请添加声明)。

于 2012-04-18T08:55:23.040 回答