gpt4 book ai didi

owin - 使用 OWIN 的混合模式身份验证

转载 作者:行者123 更新时间:2023-12-04 18:08:03 26 4
gpt4 key购买 nike

我正在构建一个 MVC 5 应用程序。我需要根据 AD 和 sql 数据库或 Web 服务对人员进行身份验证。

要求是如果一个人登录到公司网络或通过 VPN 连接,我必须在不要求凭据的情况下登录它们。如果用户通过互联网访问网站或某人没有 AD 帐户,我必须使用表单例份验证。

我在看这个article但这是否适用于 ASP.Net MVC 和 OWIN?还有其他选择吗?

提前致谢。

最佳答案

我现在也在做一些非常相似的事情。我为内部和外部用户提供了一个单点登录门户,他们可以在其中使用他们的 AD 帐户或指定的用户/密码组合登录。

我目前是如何实现这一点的(请注意,这仍在进行中)是通过以下方式实现的。我也在使用 ASP.NET Identity 2.1 alpha包括 SignInManager(非常酷)。

  • 使用可选密码设置用户帐户(必须为非 AD 用户指定)
  • 将 UserLogin 关联到 AD 用户的帐户,ProviderKey 等于他们的 AD 帐户 Sid
  • 在登录时,我检测是否 Request.LogonUserIdentity有一个已知的帐户。然后使用 UserManager.FindAsync 检查它们是否有效。方法。从这里您可以再次挑战他们,为他们提供以已知用户身份直接登录或直接登录的选项(您在此处选择)。
  • 然后,我还允许他们通过检测以域\用户名格式输入的用户名,通过标准用户登录表单登录。这允许域用户在从外部或从其他用户计算机进入您的站点时登录。

  • 此过程中的一些代码片段(这些只是一些示例,可让您继续学习,因为完整的解决方案已分布在我的解决方案中)。

    使用 Request.LoginUserIdentity 登录。这可能是您的帐户 Controller 中的一种方法。
    public async Task<ActionResult> WindowsLogin(string returnUrl)
    {
    var loginInfo = GetWindowsLoginInfo();
    var user = await _userManager.FindAsync(loginInfo);
    if (user != null)
    {
    await SignInAsync(user, false);
    return RedirectTo(returnUrl, "Manage");
    }

    return RedirectToAction("Login");
    }

    private UserLoginInfo GetWindowsLoginInfo()
    {
    if (Request.LogonUserIdentity == null || Request.LogonUserIdentity.User == null)
    {
    return null;
    }
    return new UserLoginInfo("Windows", Request.LogonUserIdentity.User.ToString());
    }

    我还在我的 ApplicationSignInManager(继承自 SignInManager)中添加了一个方法,以允许用户使用标准登录表单使用他们的 AD 详细信息登录。
    public async Task<SignInStatus> WindowsLoginAsync(string userName, string password, bool isPersistent)
    {
    var signInStatus = SignInStatus.Failure;

    using (var context = new PrincipalContext(ContextType.Domain, "YourDomain"))
    {
    // validate the credentials
    bool credentialsValid = context.ValidateCredentials(userName, password);

    if (credentialsValid)
    {
    UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(context, userName);
    if (userPrincipal != null)
    {
    var loginInfo = new ExternalLoginInfo
    {
    Login = new UserLoginInfo(AuthenticationTypes.Windows, userPrincipal.Sid.ToString())
    };
    signInStatus = await ExternalSignInAsync(loginInfo, isPersistent);
    }
    }
    }
    return signInStatus;
    }

    然后这可以像这样在您的登录方法中使用。
    Regex domainRegex = new Regex("(domain\\.+)|(.+@domain)");
    if (domainRegex.IsMatch(model.Username))
    {
    result = await _signInManager.WindowsLoginAsync(model.Username, model.Password, model.RememberMe);
    switch (result)
    {
    case SignInStatus.Success:
    return RedirectTo(returnUrl, "Manage");
    }
    }

    result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, true);
    ...

    我希望其中的一些内容可以帮助您解决问题!

    关于owin - 使用 OWIN 的混合模式身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027753/

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