2011-08-26 51 views
1

我有几个系统使用外部认证,谷歌认证。 我只是将登录信息保存在会话变量中,并以这种方式跟踪用户(没有成员资格提供者)。外部提供的用户名作为身份?

我想在HttpContext.Current.User对象中拥有用户身份。 我应该为Global.asax.cs中的事件手动分配用户吗,还是我可以在会话期间自动识别用户?

回答

1

使用会员提供商,它会给你你想要的。即使创建自己的提供者也不是太难,只需实现抽象类MembershipProvider并插入配置,或者使用一些开箱即用的提供者。

不要为安全等重要问题推出自己的解决方案,否则将会出现安全漏洞。在会话中存储身份验证信息是一个非常糟糕的主意。它使会话劫持,会话重播攻击等成为可能。

如果您确实想要遵循自定义身份验证的路线。然后看看我发布的代码here。它会告诉你如何控制认证cookie,并用它来创建你自己的HttpContext.Current.User实例。

+1

好吧,只使用成员资格提供程序并不能使它更安全。内置的表单身份验证使用的Cookie很容易受到重播攻击。 –

+0

是绝对的,但没有理由把它扔掉。与几乎所有的家庭解决方案相比,表单身份验证仍然更安全,经过测试和稳定。推出自己的方法确实是一个糟糕的主意。而是基于FormsAuthentication构建,以防止会话重放攻击和会话劫持等。其中大部分都通过在框架内构建的缓解措施进行了详细记录。会话比基于cookie的表单身份验证更容易受到攻击。 – TheCodeKing

+0

我添加了一些代码的链接,显示了如何自己管理身份验证cookie。这可能是更多你正在寻找的东西。 – TheCodeKing

2

你可以写一个自定义的授权属性,它会从会话分配HttpContext.Current.User财产的护理:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var user = httpContext.Session["username"] as string; 
     if (string.IsNullOrEmpty(user)) 
     { 
      // we don't have any username inside the session => unauthorized access 
      return false; 
     } 

     // we have a username inside the session => assign the User property 
     // so that it could be accessed from anywhere 
     var identity = new GenericIdentity(user); 
     httpContext.User = new GenericPrincipal(identity, null); 
     return true; 
    } 
} 

然后简单的装饰您的控制器/需要与此自定义属性认证操作。

+0

会话非常不安全,因为会话cookie只是一个任意标记。您可以相对轻松地强制某个特定的会话ID。然后,如果它用于身份验证,您可以自己使用此令牌来获得对其帐户的控制权。因此,最好使用身份验证cookie,它是用户和服务器专用的加密令牌。偷走要困难得多。 – TheCodeKing

+0

@TheCodeKing,同意会话ID不安全,应使用标准形式的身份验证。 –

相关问题