将自定义数据添加到 ADFS 身份验证

Add custom data to ADFS authentication

我有很多应用程序,我正在将身份验证切换到 ADFS,我需要添加自定义数据,比如说成功登录后数据库中的一组角色。

场景解释: 每个应用程序在数据库中都有自己的角色, 在发送授权请求后的用户身份验证期间,将调用 Application_AuthenticateRequest(object sender, EventArgs e),因此我可以像这样

添加角色作为声明
 ((ClaimsIdentity)((ClaimsPrincipal)currentUser).Identity)
                    .AddClaim(new Claim(ClaimTypes.Role, "role1FromDataBase"));
                HttpContext.Current.User = currentUser;

但是每个请求都会调用Application_AuthenticateRequest()方法,我不想每次都从数据库中请求角色。 所以,我需要在某处添加这些角色,然后才能调用它们。当然,当我处理API基于角色的授权时,Session 和 Cookies 并不是最佳实践。

应用程序在 Windows 服务器 2012

上有控制器和 APIs 以及我的 ADFS

我的 OWIN 启动是

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = realm,
                MetadataAddress = adfsMetadata,

                Notifications = new WsFederationAuthenticationNotifications()
                {

                    RedirectToIdentityProvider = context =>
                    {   

                        context.ProtocolMessage.Wreply = "https://localhost:44329/";
                        return Task.FromResult(0);
                    }
                },

            });


        app.UseStageMarker(PipelineStage.Authenticate);

我能做什么?

几个小时后我解决了这个问题 在 Startup Class 和 public void Configuration(IAppBuilder app) 方法中 我们必须将具有角色的声明添加到 WsFederationAuthenticationOptions 像这样

 app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
        {
            Wtrealm = realm,
            MetadataAddress = adfsMetadata,

            Notifications = new WsFederationAuthenticationNotifications()
            {
                // this method will be invoked after login succes 
                SecurityTokenValidated = notification =>
                {
                    ClaimsIdentity identity = notification.AuthenticationTicket.Identity;
                    // here we can add claims and specify the type, in my case i want to add Role Claim
                    identity.AddClaim(new Claim(ClaimTypes.Role, "student"));

                    return Task.FromResult(0);
                },
                RedirectToIdentityProvider = context =>
                {

                    context.ProtocolMessage.Wreply = "https://localhost:44329/";
                    return Task.FromResult(0);
                }
            },

        });