很容易创建一个基于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可以处理您的要求。您将需要实现自己的身份验证提供商并将其插入框架,但没有更多的东西。至于授权,那里也有很多选择。