Asp.net MVC - 将声明身份映射到自定义用户身份

时间:2011-09-26 14:16:04

标签: asp.net-mvc-3 claims-based-identity acs

我正在尝试从Azure AccessControl Service 2.0收到声明身份验证后,确定ASP.NET MVC3基础结构中最佳扩展点的位置,以映射自定义用户信息(从本地数据库加载)

我试图通过覆盖Microsoft.IdentityModel.Claims.ClaimsAuthenticationManager类的Authenticate方法来实现这一点:

public class ClaimsTransformationModule : ClaimsAuthenticationManager
{
    public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
    {
        // Load User from database and map it to HttpContext
        // Code here

        return base.Authenticate(resourceName, incomingPrincipal);
    }
}

但是,似乎在页面加载请求期间多次调用此方法。 在此处加载自定义用户信息可能会产生性能问题。 我想在每个经过身份验证的会话中加载它们一次。

有更好的地方吗? 也许是在IClaimsPrincipal构建的较低层的某个地方?

3 个答案:

答案 0 :(得分:2)

您只需要进行isAuthenticated检查:

if (incomingPrincipal.Identity.IsAuthenticated)
{
   // Load User from database and map it to HttpContext
   // Code here
}

这只会在用户首次通过身份验证后运行一次。

答案 1 :(得分:1)

仅在用户登录时运行一次。

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
            FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated += WSFederationAuthenticationModule_SecurityTokenValidated;
        }

        void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
        {
            IClaimsPrincipal principal = e.ClaimsPrincipal;
            IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;

            try
            {
                //SQL connection / Claims injeciotn
                if (principal.Identity.IsAuthenticated)
                {
                   // identity.Claims.Add(new Claim(ClaimTypes.Role, "WebAdmins"));
                }

            }
            catch
            {
                //Error
            }
        }
    }

答案 2 :(得分:0)

任何非来自STS的用户信息都是关于用户的卫星数据。所以最好用Asp .Net ProfileProvider基础设施代表它。

<强>更新

您可以做的另一件事是实现一个简单的自定义STS,它将您的数据库中的自定义声明添加到传入的声明中。您的自定义STS将信任ACS并将使用SAML令牌,并且它将受到您的Web应用程序的信任。

我还没试过的另一件事是试图篡改STS提出的索赔。您可以尝试的一件事是注册WSFederationAuthenticationModule的SecurityTokenValidated事件。在这种情况下,您可以尝试将其他声明添加到事件arg的ClaimsPrincipal中。

此事件应在创建会话令牌之前引发,因此您每次登录时都应该查找db。

欢呼,