在外部ADFS登录加载任何页面之前获取用户声明

本文关键字:获取 用户 声明 任何页 外部 ADFS 登录 加载 | 更新日期: 2023-09-27 18:01:23

我要做的是访问从ADFS登录返回的用户声明。ADFS返回用户名,并与该用户名,我必须运行查询到另一个数据库获取用户信息并存储它。我真的不知道在哪里做,最好的做法是什么。我可以在视图控制器中访问用户声明,比如:

public ActionResult Index()
{
    var ctx = Request.GetOwinContext();
    ClaimsPrincipal user = ctx.Authentication.User;
    IEnumerable<Claim> claims = user.Claims;
    return View();
}

但是我需要做的是,正如我所说的访问声明,就像在global.asax.cs或startup.cs中一样,在应用程序运行之前存储用户信息。

我的Startup.Auth.cs文件:

public partial class Startup
{
    private static string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
    private static string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];
    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(
            new CookieAuthenticationOptions
            {
                AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
            });
        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = realm,
                MetadataAddress = adfsMetadata
            });
    }
}

在外部ADFS登录加载任何页面之前获取用户声明

我们在启动文件中为WsFederationAuthenticationOptions值添加一个事件处理程序。

这将在安全令牌验证后立即发生。

app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions()
{
    MetadataAddress = MetadataAddress,
    Wtrealm = Wtrealm,
    Wreply = CallbackPath,
    Notifications = new WsFederationAuthenticationNotifications()
    {
        SecurityTokenValidated = (ctx) =>
        {
           ClaimsIdentity identity = ctx.AuthenticationTicket.Identity;
           DoSomethingWithLoggedInUser(identity);
        }
     }
};