使用Windows域帐户和应用程序管理的帐户



很容易创建一个基于Windows域用户身份验证的 asp.net MVC 应用程序。创建一个使用 Entity Framework 存储的单个帐户也很容易。实际上,两者都有项目模板。

,但我想在同一应用程序中使用两种身份验证。我试图将两个项目模板中的代码组合在一起。我在startup.auth.cs。

中有问题
// from "Individual Accounts" template
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

Cookie身份验证OWIN中间件的存在似乎会导致域名变得未经认可。如果我将这条线淘汰,则域身份验证有效。但是没有它,我似乎无法支持各个用户帐户。

我已经下载了katana项目源代码并检查了cookiuthenticationhandler.cs,但我不太了解它在OWIN管道的上下文中的工作方式。

我如何使用ASP.NET身份框架允许我的应用程序从Windows域或特定于应用程序的用户存储进行身份验证用户?> 最简单的方法是只有2个不同的演示项目才能进行身份验证/授权。

这具有依靠现有框架和标准配置的优势。

从那里,您决定

  • 为每个Internet用户创建广告用户,或
  • 为每个广告用户创建一个DB/Internet用户。

为每个广告用户创建身份用户更容易进一步实施。那么整个应用程序中都可以存在相同的cookie和过滤器。

在这种情况下,您可以

  • 使用子域的应用程序
  • AD真实项目可以具有身份验证/授权的单一目的,然后Web应用程序可以代表您的应用程序的其余部分。

另外,如果您想要一个真正统一的解决方案,请使用Mohammadyounes/Owin-Mixedauth

Mohammadyounes/Owin-Mixedauth

Install-Package OWIN-MixedAuth

in web.config

<location path="MixedAuth">
  <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</location>

in in Startup.auth.cs

app.UseMixedAuth(cookieOptions);

如何工作:

处理程序使用ApplyResponseChallengeAsync确认请求是A 401挑战。如果是这样,它将其重定向到回调路径从IIS请求身份验证,该验证已配置为查询AD。

        AuthenticationResponseChallenge challenge = Helper.LookupChallenge(
              Options.AuthenticationType, Options.AuthenticationMode);

a 401挑战是由未经授权的用户试图使用需要身份验证的资源

引起的

处理程序使用InvokeAsync检查是否来自A 回调路径(IIS),然后致电AuthenticateCoreAsync

    protected async override System.Threading.Tasks.Task<AuthenticationTicket>
                AuthenticateCoreAsync()
    {
        AuthenticationProperties properties = UnpackStateParameter(Request.Query);
        if (properties != null)
        {
            var logonUserIdentity = Options.Provider.GetLogonUserIdentity(Context);
            if (logonUserIdentity.AuthenticationType != Options.CookieOptions.AuthenticationType
                && logonUserIdentity.IsAuthenticated)
            {
                AddCookieBackIfExists();
                ClaimsIdentity claimsIdentity = new ClaimsIdentity(
                    logonUserIdentity.Claims, Options.SignInAsAuthenticationType);
                //  ExternalLoginInfo GetExternalLoginInfo(AuthenticateResult result)
                claimsIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier,
                  logonUserIdentity.User.Value, null, Options.AuthenticationType));
                //could grab email from AD and add it to the claims list.
                var ticket = new AuthenticationTicket(claimsIdentity, properties);
                var context = new MixedAuthAuthenticatedContext(
                   Context,
                   claimsIdentity,
                   properties,
                   Options.AccessTokenFormat.Protect(ticket));
                await Options.Provider.Authenticated(context);
                return ticket;
            }
        }
        return new AuthenticationTicket(null, properties);
    }

AuthenticateCoreAsync使用 AddCookieBackIfExists读取AD创建的索赔曲奇,并创建其自己的索赔。

AD用户提供了与Web用户相同的索赔的cookie。AD现在就像其他任何第三方身份验证者( Google,FB,LinkedIn

由于这个原因,我无法使用预烘烤的解决方案进行身份验证。在我们的项目中,过去的几年(和敏捷方法)为我们提供了4种不同的方法来验证这很烦人,但是我们支持该领域中应用程序的所有遗产版本,因此我们必须保留所有应用程序(至少目前)。

我最终创建了一个工厂,该工厂可以算出身份验证机制(通过几种方式,例如令牌格式,其他某些东西的存在),然后返回一个包装器,该包装器带有用于验证该身份验证方法并设置本金的逻辑的包装器。

这将在自定义 http模块中启动,以便在请求到达控制器之前构建和身份验证主体。我认为,就您而言,Windows auth将是最后的后备。在我们的 Web API 应用程序中,我们采用了相同的方法,但是通过委派处理程序而不是 http模块。您可以说,这是一种本地令牌联合会。当前的实现使我们能够添加或修改任何验证过程,或添加任何其他令牌格式;最后,用户以适当的身份或被拒绝。只花了几天才能实施。

在我看来,这个问题的最佳答案是使用身份验证和授权框架。有很多可供选择(商业和免费)。您当然可以写自己的书,但我会劝阻它。很多非常聪明的人弄错了。

我会看一下IdentityServer3。当然,这不是唯一的解决方案,而是一个很好的身份验证和授权框架。它是开源的,很容易赶紧起床。您的用例是常见的用例,您会在上面的链接中找到一些非常有用的信息。授权和身份验证,社交认证选项,易于与JSON Web令牌合作的清洁分离,封装用户索赔等等。

如何帮助您

IdentityServer3允许您配置身份提供商来处理身份验证,并且有很多扩展点可以使您实现一系列可以处理两种情况的责任。从文档中:

IdentityServer支持使用外部身份提供商的身份验证。外部身份验证机制必须封装在Katana身份验证中间件中。

katana本身与中间件一起用于Google,Facebook,Twitter,Microsoft帐户,WS -Federation和OpenID Connect-但也有社区开发的Middlewares(包括Yahoo,LinkedIn和Saml2p)。

要为外部提供商配置中间件,请在您的项目中添加一种方法,该方法接受iAppbuilder和字符串作为参数。

IdentityServer3通过浏览器登录窗口支持AD作为身份提供者,并将通过自定义赠款支持更具程序化的实现。您还可以在此处查看有关IdentityServer3和AD身份验证的更多信息。

它也将支持Windows身份验证,您可以在此处查看以获取有关实施的信息和示例。

这里也有一个很好的入门示例。

使用正确的配置IdentityServer3可以处理您的要求。您将需要实现自己的身份验证提供商并将其插入框架,但没有更多的东西。至于授权,那里也有很多选择。

相关内容

  • 没有找到相关文章

最新更新