我正在尝试从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构建的较低层的某个地方?
答案 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。
欢呼,