gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:59:10 24 4
gpt4 key购买 nike

创建基于 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 项目源代码并检查了 CookieAuthenticationHandler.cs,但我不太明白它在 OWIN 管道的上下文中是如何工作的。

如何使用 ASP.net 身份框架允许我的应用程序对来自 Windows 域或特定于应用程序的用户存储的用户进行身份验证?

最佳答案

最简单的方法是有 2 个不同的演示项目仅用于身份验证/授权。

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

从那里,你决定要么

  • 为每个互联网用户创建一个 AD 用户,或者
  • 为每个 AD 用户创建一个 DB/Internet 用户。

为每个 AD 用户创建一个身份用户更容易进一步实现。然后相同的 cookie 和过滤器可以存在于整个应用程序中。

在这种情况下,您可以

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

或者,如果您想要一个真正统一的解决方案,请使用 MohammadYounes/Owin-MixedAuth

MohammadYounes/Owin-MixedAuth

安装包 OWIN-MixedAuth

Web.config

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

Startup.Auth.cs 中

app.UseMixedAuth(cookieOptions);

:

:

工作原理:

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

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

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

处理程序使用 InvokeAsync 检查请求是否来自回调路径 (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 创建的声明 cookie 并创建它自己的声明。

为 AD 用户提供与 Web 用户相同的基于声明的 Cookie。 AD 现在就像任何其他第 3 方验证器(Google、FB、LinkedIN)

关于c# - 使用 Windows 域帐户和应用程序管理的帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com