通过应用内授权进行OWIN WsFederation身份验证

时间:2016-05-21 12:58:58

标签: asp.net-mvc authentication authorization owin ws-federation

情景:

  • 公司内部用户的ASP.NET MVC Web应用程序,使用Microsoft.Owin.Security.WsFederation
  • 配置为针对公司的ADFS进行身份验证
  • 该公司的ADFS包含多个用户,但只有少数用户能够登录该应用程序。
  • 因此我有一个包含这些用户的数据库表'电子邮件地址
  • Web应用程序应检查数据库表中是否存在从ADFS收到的电子邮件声明,并且仅为这些用户发出登录令牌。
  • 其他用户应该被重定向到"抱歉,您无权使用此应用程序" -page。

我的问题:

  • 放置授权逻辑以确定是否允许用户进入的正确位置在哪里?

这是我的Startup.Configuration方法中的代码:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWsFederationAuthentication(
    new WsFederationAuthenticationOptions
    {
        MetadataAddress = "https://.../FederationMetadata.xml",
        Wtrealm = "...",                        
    }
);

1 个答案:

答案 0 :(得分:3)

您有两种方法可以实现您的目标:

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);
                }
            }