外部提供的用户名为身份?

时间:2011-08-26 20:55:57

标签: asp.net asp.net-mvc authentication

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

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

2 个答案:

答案 0 :(得分:2)

您可以编写一个自定义Authorize属性,该属性将负责从会话中分配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;
    }
}

然后只需装饰需要使用此自定义属性进行身份验证的控制器/操作。

答案 1 :(得分:1)

使用会员提供商,它会准确地提供您想要的内容。即使创建自己的提供者也不是太困难,只需实现抽象类MembershipProvider并插入config,或者使用一些现成的提供者。

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

如果您真的想沿着自定义身份验证的路线前进。然后看看我发布的代码here。它将向您展示如何控制身份验证cookie,并使用它来创建您自己的HttpContext.Current.User实例。