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

2023-12-24

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

要求是,如果一个人登录到公司网络或通过 VPN 连接,我必须登录他们而不要求提供凭据。如果用户通过互联网访问网站或没有 AD 帐户,我必须使用表单身份验证。

我正在看这个article http://msdn.microsoft.com/en-us/library/ms972958.aspx但这可以与 ASP.Net MVC 和 OWIN 一起使用吗?还有其他选择吗?

提前致谢。


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

我目前如何实现这一目标(请注意,这仍在进行中)是通过以下方式实现的。我也在使用ASP.NET 身份 2.1 阿尔法 http://blogs.msdn.com/b/webdev/archive/2014/06/05/asp-net-identity-2-1-0-alpha1.aspx其中包括 SignInManager(非常酷)。

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

此过程中的一些代码片段(这些只是帮助您继续前进的一些示例,因为完整的解决方案分布在我的解决方案中)。

使用 Request.LoginUserIdentity 登录。这可能是您帐户控制器中的一种方法。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OWIN 的混合模式身份验证 的相关文章

随机推荐

  • css 字体大小和行高与基线不匹配

    我正在尝试做一些应该非常简单的事情 但我在失败和论坛之间度过了一天 我想调整我的字体以匹配我的基线 在 indesign 中只需点击一下即可 但在 css 中这看起来是地球上最困难的事情 让我们举一个有理值的简单例子 在这张图片上 我每 2
  • Theano 张量切片...如何使用布尔值进行切片?

    在 numpy 中 如果我有一个布尔数组 我可以用它来选择另一个数组的元素 gt gt gt import numpy as np gt gt gt x np array 1 2 3 gt gt gt idx np array True F
  • 如何重用多处理池?

    底部是我现在拥有的代码 看起来效果很好 但是 我并不完全理解它 我以为没有 join 我冒着在池完成执行之前代码进入下一个 for 循环的风险 我们不需要那 3 行注释掉的行吗 另一方面 如果我要和 close and join 方式 有什
  • 影响数据库的 Angular e2e 测试

    这是我的问题 一步一步 我认为这样读起来更好 不像一堵文字墙可怜地试图解释我的特定领域的问题 1 我们有一个Angular js应用程序与PHP后端支持MongoDB贮存 2 Protractor用于端到端测试 3 需要测试改变数据库的页面
  • C# HttpWebRequest POST 不发送参数

    我正在尝试使用下一个代码执行带有参数的 POST 请求 我正在使用本地 php 脚本来接收参数 但是当我执行请求时 php 脚本没有接收从我的 C 函数发送的参数 它说 注意 未定义索引 detalle 注意 未定义索引 method pa
  • Glassfish - 上传图像 - 正确执行

    我使用的是最新的 glassfish 3 1 2 所以不需要 apache FileItem 并且 getPart 没有错误 我读到上传图像的最佳实践是将它们保存在文件系统上 请参阅here https stackoverflow com
  • 如何查看包的历史记录?

    如何查看 Npm 注册表中包的历史记录 我特别想知道什么时候https npmjs org package npm https npmjs org package npm1 1 2版本发布 你可以做npm view npm您可以在以下位置找
  • 删除as3中的空格

    如何从 as3 中的字符串中删除空格 我希望能够删除所有回车符 空格 制表符等 您可以使用正则表达式 var rex RegExp s r n gim var str String This is a string str str repl
  • 即使 Ant 任务失败,Ant 也会成功

    我一定缺少一个简单的设置 所以请原谅我 但我有两次注意到我的坏蚂蚁任务不会导致构建失败 例如 当源文件不存在时 Ant 复制 构建成功 Ant 解压缩 当任务报告 无法写入文件 或类似消息时 构建成功 Ant 执行错误 语法无效 构建成功
  • 如何在WPF中叠加图像?

    我有两个图像需要重叠 例如 我需要在实心矩形顶部有一个实心圆 所以 我可以看到整个圆 但只能看到矩形的角 我不希望圆圈是透明的 原本的circle png没有矩形边框 它的边界仅沿着圆的边界 因此 理想情况下 整个圆不应与矩形重叠 这是显示
  • 员工工资查询错误

    我正在尝试制作一家公司的薪资报告 我想通过使用如下查询来显示该公司的所有员工 select tab1 name tab1 job tab1 salary tab2 discount days tab1 salary tab1 salary
  • cmd中转义特殊字符

    我有一个 Windows bat 脚本 在其中尝试运行参数中包含密码的命令 我希望能够使用的密码是 gt lt 从我读到的here http ss64 com nt syntax esc html 我应该逃走 lt gt with 根据我的
  • glDrawArrays 上的 OpenGL ES EXC_BAD_ACCESS

    我在 OpenGL ES 1 1 中为我正在构建的 iPhone 游戏进行渲染时遇到问题 简而言之 我正在渲染 3 个项目 背景 效果很好 许多球形物体 效果很好 一个改变大小的简单线圆 我在这里遇到问题 基本上 当我在圆上调用 drawA
  • 如何生成 Identity Server 签名证书

    在身份服务器示例中 我们发现这样的代码Startup cs var certFile env ApplicationBasePath idsrv3test pfx var signingCertificate new X509Certifi
  • C++ 二进制文件和迭代器:使用 ifstreambuf_iterator 摆脱 1:1 的束缚?

    这个答案 https stackoverflow com a 13665583 2485710指出 C 不太适合对二进制文件进行迭代这一事实 但这正是我现在所需要的 简而言之 我需要以 二进制 方式操作文件 是的 所有文件都是二进制的 即使
  • 对 SVG 组进行动画处理

    我目前有以下 SVG
  • 使用 Lua 注册闭包

    我不想使用 lua CFunction 签名来编写从 Lua 调用的方法 而是使用我自己的函数签名来简化导出过程 void foo call t call int a char b char c table t d reading argu
  • Angular Reactive 表单嵌套 FormGroup 中的空值

    我有一个带有嵌套表单组的角反应表单 this form new FormGroup name new FormControl address new FormGroup line1 new FormControl line2 new For
  • Modernizr 可以异步加载脚本但按顺序执行它们吗?

    我正在尝试 Modernizer load 我有这个 Modernizr load load js jquery 1 6 1 js js jquery tools min js js myscript js 如果我理解正确的话 我可以使用这
  • 使用 OWIN 的混合模式身份验证

    我正在构建一个 MVC 5 应用程序 我需要根据 AD 和 SQL 数据库或 Web 服务对人员进行身份验证 要求是 如果一个人登录到公司网络或通过 VPN 连接 我必须登录他们而不要求提供凭据 如果用户通过互联网访问网站或没有 AD 帐户