将自定义数据添加到 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);
}
},
});
我有很多应用程序,我正在将身份验证切换到 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);
}
},
});