[英]Windows Authentication and local DB user authentication
我在我的 MVC 应用程序中使用 windows 身份验证模拟。当我打开应用程序时,浏览器会显示凭据提示并验证域用户。
但是现在我还想在我的应用程序中创建用户,并且还想对存储在我的数据库中的用户进行身份验证。
是否可以使用域用户的 windows 身份验证来验证应用程序数据库用户。 我对此做了很多 R & D ,但还没有找到任何解决方案。 我会很感激你的建议。 谢谢!
如果我理解正确,您希望同时允许 Windows 身份验证和 Forms 身份验证。 这不是一件常见的事情,但我已经做到了。 我是这样做的:
您必须使用 forms 身份验证作为您的主要身份验证。 因此,像往常一样构建 Forms 身份验证:您有一个登录页面,在提交后,它会验证数据库中的凭据。 棘手的部分是添加 Windows 身份验证。
为此,请在您的身份验证 controller 中创建一个使用 Windows 身份验证的操作。 对于此示例,我假设您的 controller 是AuthController
,我们将调用操作WinLogin
。 该操作将如下所示:
[Authorize]
public ActionResult WinLogin() {
var principal = HttpContext.User;
if (principal == null || !principal.Identity.IsAuthenticated) {
//Windows authentication failed
return new HttpUnauthorizedResult();
}
// User is validated, so create the form authentication cookie
FormsAuthentication.SetAuthCookie(principal.Identity.Name, false);
return new EmptyResult();
}
它只是检查用户是否经过验证,如果是,则使用其 AD 用户名设置 Forms 身份验证 cookie。
为此,要使用 Windows 身份验证,您必须更新您的 web.config 以告诉它仅对那一项操作使用 Windows 身份验证。 您可以使用<location>
标签:
<location path="Auth/WinLogin">
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
默认情况下,IIS 不会让您在配置中的此位置更改身份验证方法。 您需要更新 IIS 管理器中的“功能委派”以允许它。
如果您使用 IIS Express 进行调试,您必须为此做类似的事情:
.vs\config\applicationhost.config
。"Allow"
:<section name="anonymousAuthentication" overrideModeDefault="Allow" />
<section name="windowsAuthentication" overrideModeDefault="Allow" />
接下来更新您的登录页面以默认隐藏用户名和密码字段(假设它们位于 ID 为loginBox
的框内)。 这个想法是您对WinLogin
操作执行 AJAX 请求,如果成功,则将用户转发到主页或他们尝试 go 到的任何页面。 如果你使用 jQuery,它看起来像这样:
$.get("@Url.Action("WinLogin", "Auth")")
.done(function() {
//success! forward to the page they want
window.location.replace(returnUrl);
}).fail(function() {
//failed - show manual login prompt
$("#loginBox").show();
});
});
只要您的网站已经是受信任的网站(我假设如果您现在已经有 Windows 身份验证工作),那么 Windows 身份验证将在该 AJAX GET 请求期间发生。
注意window.location.replace()
的使用,它不会将登录页面添加到浏览器历史记录中,因此如果用户随后点击后退按钮,他们不会返回登录页面。 它使事情变得更加无缝。
您还可以添加一个加载圈或其他内容来指示用户应该在 GET 发生时等待,但您可以决定。
有了这一切,用户体验应该是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.