2012-04-18 107 views
1

按照本指南中的步骤Using Azure ACS我配置了一个可用的Azure ACS服务&通过Facebook进行身份验证,重定向回到运行在我的开发服务器上的网站。Azure ACS,WIF 3.5,Asp.Net 3.5自定义会员供应商和IsAuthenticated

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

目前,使用Facebook和AzureACS进行身份验证后,用户可以请求安全页面,例如ViewAccountBalance.aspx,即使该帐户因为开箱即用的IsAuthenticated标志为true而不存在。有兴趣听听别人做了什么,最好的做法是什么。

回答

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(如果用户具有配置文件,请添加声明)。

+0

在Global.asax的OnInit()中增加了: this.PostAcquireRequestState + =(s,e)=> SecurityHelper.PostAcquireRequestState(); 然后,在SecurityHelper.PostAcquireRequestState中,我有逻辑来检查页面是否由标准FormsAuth保护,类似于(http://stackoverflow.com/questions/3390719/determine-if-current-page-requires-authorization) 我也通过Membership.GetUser进行查找,并检查帐户是否存在,否则我重定向到注册页面。 – Andre 2012-04-19 08:19:40

0

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