具有应用程序内授权的 OWIN WsFederation 身份验证
OWIN WsFederation authentication with in-app authorization
场景:
- 用于公司内部用户的 ASP.NET MVC Web 应用程序,配置为针对公司的 ADFS 进行身份验证,使用
Microsoft.Owin.Security.WsFederation
- 公司的ADFS包含多个用户,但应该只有少数用户可以登录到应用程序。
- 因此我有一个包含这些用户电子邮件地址的数据库table
- Web 应用程序应检查从 ADFS 收到的电子邮件声明是否存在于数据库中 table,并且只为这些用户发出登录令牌。
- 应将其他用户重定向到 "Sorry you are not authorized to use this application" 页面。
我的问题:
- 检查用户是否应该被允许进入的授权逻辑的正确位置在哪里?
这是我的 Startup.Configuration 方法中的代码:
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
MetadataAddress = "https://.../FederationMetadata.xml",
Wtrealm = "...",
}
);
你有两种选择来实现你想要的:
1. 一种是在 AD FS 上配置它。我个人认为这是执行此操作的正确方法,因为 AD FS 是 IdP,它应该控制其用户是否有权访问应用程序。在这种情况下,公司应该或不应该允许某人使用其部分资源(当然也有反对意见)。这可以通过 AD FS 管理 GUI 在域控制器上轻松完成。以下答案很好地描述了这一点:
https://serverfault.com/a/676930/321380
2. 其次是以这种方式在 OWIN WSFed 中间件中使用 Notifications 对象:
Notifications = new WsFederationAuthenticationNotifications()
{
SecurityTokenValidated = (context) =>
{
//extract claims' values and check identity data against your own authorization logic
bool isAuthorized = CheckForUnauthorizedAccess();
if (!isAuthorized)
{
throw new SecurityTokenValidationException("Unauthorized access attemp by {some_identifier}");
}
return Task.FromResult(0);
},
AuthenticationFailed = (context) =>
{
if (context.Exception is an unauthorized exception)
{
context.OwinContext.Response.Redirect("<unauthorized_redirect_url>");
}
context.HandleResponse(); // Suppress the exception
//exception logging goes here
return Task.FromResult(0);
}
}
场景:
- 用于公司内部用户的 ASP.NET MVC Web 应用程序,配置为针对公司的 ADFS 进行身份验证,使用
Microsoft.Owin.Security.WsFederation
- 公司的ADFS包含多个用户,但应该只有少数用户可以登录到应用程序。
- 因此我有一个包含这些用户电子邮件地址的数据库table
- Web 应用程序应检查从 ADFS 收到的电子邮件声明是否存在于数据库中 table,并且只为这些用户发出登录令牌。
- 应将其他用户重定向到 "Sorry you are not authorized to use this application" 页面。
我的问题:
- 检查用户是否应该被允许进入的授权逻辑的正确位置在哪里?
这是我的 Startup.Configuration 方法中的代码:
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
MetadataAddress = "https://.../FederationMetadata.xml",
Wtrealm = "...",
}
);
你有两种选择来实现你想要的:
1. 一种是在 AD FS 上配置它。我个人认为这是执行此操作的正确方法,因为 AD FS 是 IdP,它应该控制其用户是否有权访问应用程序。在这种情况下,公司应该或不应该允许某人使用其部分资源(当然也有反对意见)。这可以通过 AD FS 管理 GUI 在域控制器上轻松完成。以下答案很好地描述了这一点: https://serverfault.com/a/676930/321380
2. 其次是以这种方式在 OWIN WSFed 中间件中使用 Notifications 对象:
Notifications = new WsFederationAuthenticationNotifications()
{
SecurityTokenValidated = (context) =>
{
//extract claims' values and check identity data against your own authorization logic
bool isAuthorized = CheckForUnauthorizedAccess();
if (!isAuthorized)
{
throw new SecurityTokenValidationException("Unauthorized access attemp by {some_identifier}");
}
return Task.FromResult(0);
},
AuthenticationFailed = (context) =>
{
if (context.Exception is an unauthorized exception)
{
context.OwinContext.Response.Redirect("<unauthorized_redirect_url>");
}
context.HandleResponse(); // Suppress the exception
//exception logging goes here
return Task.FromResult(0);
}
}