यह किया जा सकता है। कॉन्फ़िगरेशन को उलट दें, ऐप/रूट को बेनामी और फॉर्म प्रमाणीकरण का उपयोग करने के लिए सेट करें ... इस तरह, आप उसी वेब एप्लिकेशन में मिश्रित प्रमाणीकरण को कॉन्फ़िगर कर सकते हैं, लेकिन यह मुश्किल है। तो सबसे पहले, loginUrl = "~/WinLogin/WinLogin2.aspx" के साथ प्रपत्र प्रमाणीकरण के लिए आपको ऐप कॉन्फ़िगर करें। एमवीसी में, रूटिंग आईआईएस द्वारा निर्धारित प्रमाणीकरण नियमों को ओवरराइड करता है, इसलिए एएसपीएक्स पेज का उपयोग करने की आवश्यकता है, क्योंकि आईआईएस फाइल पर प्रमाणीकरण सेट कर सकता है। रूट वेब एप्लिकेशन पर बेनामी और फॉर्म प्रमाणीकरण सक्षम करें। विंडोज प्रमाणीकरण सक्षम करें और रूट/WinLogin निर्देशिका में अनाम प्रमाणीकरण अक्षम करें। खाता/साइनइन यूआरएल पर रीडायरेक्ट करने के लिए कस्टम 401 और 401.2 त्रुटि पेज जोड़ें।
यह ऑटो साइनइन के लिए विंडोज एकीकृत प्रमाणीकरण का उपयोग करने के लिए पास-थ्रू करने में सक्षम किसी भी ब्राउज़र को अनुमति देगा। हालांकि कुछ डिवाइस क्रेडेंशियल्स (जैसे आईफोन) और साइनइन पेज पर रीडायरेक्ट किए गए ब्लैकबेरी जैसे अन्य उपकरणों के लिए संकेत दिए जाएंगे।
यह कुकी को स्पष्ट रूप से उपयोगकर्ताओं की भूमिकाओं को जोड़कर बनाता है और एक सामान्य सिद्धांत बनाता है ताकि भूमिका-आधारित प्राधिकरण का उपयोग किया जा सके।
WinLogin2.aspx में (IIS में "रूट" वेब अनुप्रयोग के तहत WinLogin निर्देशिका में, और विंडोज प्रमाणीकरण, बेनामी अक्षम, और फॉर्म सक्षम करने के लिए कॉन्फ़िगर किया गया है (जैसा कि बंद नहीं हो सकता है ... नोट IIS शिकायत करेगा जब आप विंडोज़ प्रमाणीकरण सक्षम है, बस ध्यान न दें): AccountController में
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script>
window.location.assign('../Account/Signin');
</script>
</head>
<body>
</body>
</html>
:
var logonUser = Request.ServerVariables["LOGON_USER"];
if (!String.IsNullOrWhiteSpace(logonUser))
{
if (logonUser.Split('\\').Length > 1)
{
var domain = logonUser.Split('\\')[0];
var username = logonUser.Split('\\')[1];
var timeout = 30;
var encTicket = CreateTicketWithSecurityGroups(false, username, domain, timeout);
var authCookie = new HttpCookie(".MVCAUTH", encTicket) { HttpOnly = true };
Response.Cookies.Add(authCookie);
}
//else
//{
// this is a redirect due to returnUrl being WinLogin page, in which logonUser will no longer have domain attached
// ignore as forms ticket should already exist
//}
string returnUrl = Request.QueryString["ReturnUrl"];
if (returnUrl.IsEmpty())
{
Response.Redirect("~/");
}
else
{
Response.Redirect(returnUrl);
}
}
public static string CreateTicketWithSecurityGroups(bool rememberMe, string username, string domain, int timeout)
{
using (var context = new PrincipalContext(ContextType.Domain, domain))
{
using (var principal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username))
{
var securityGroups = String.Join(";", principal.GetAuthorizationGroups());
var ticket =
new FormsAuthenticationTicket(1,
username,
DateTime.UtcNow,
DateTime.UtcNow.AddMinutes(timeout),
rememberMe,
securityGroups,
"/");
string encTicket = FormsAuthentication.Encrypt(ticket);
return encTicket;
}
}
}
आईआईएस 7.5 में, त्रुटि पृष्ठ क्लिक करें, 401 पेज Redirect401.htm फ़ाइल का रास्ता फ़ाइल, इस कोड के साथ निर्धारित किया है। ..
public ActionResult SignIn()
{
return View(new SignInModel());
}
//
// POST: /Account/SignIn
[HttpPost]
public ActionResult SignIn(SignInModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
string encTicket = CreateTicketWithSecurityGroups(model.RememberMe, model.UserName, model.Domain, FormsAuthentication.Timeout.Minutes);
Response.Cookies.Add(new HttpCookie(".MVCAUTH", encTicket));
//var returnUrl = "";
for (var i = 0; i < Request.Cookies.Count; i++)
{
HttpCookie cookie = Request.Cookies[i];
if (cookie.Name == ".MVCRETURNURL")
{
returnUrl = cookie.Value;
break;
}
}
if (returnUrl.IsEmpty())
{
return Redirect("~/");
}
return Redirect(returnUrl);
}
ModelState.AddModelError("Log In Failure", "The username/password combination is invalid");
}
return View(model);
}
//
// GET: /Account/SignOut
public ActionResult SignOut()
{
FormsAuthentication.SignOut();
if (Request.Cookies[".MVCRETURNURL"] != null)
{
var returnUrlCookie = new HttpCookie(".MVCRETURNURL") { Expires = DateTime.Now.AddDays(-1d) };
Response.Cookies.Add(returnUrlCookie);
}
// Redirect back to sign in page so user can
// sign in with different credentials
return RedirectToAction("SignIn", "Account");
Global.asax में:
protected void Application_BeginRequest(object sender, EventArgs e)
{
try
{
bool cookieFound = false;
HttpCookie authCookie = null;
for (int i = 0; i < Request.Cookies.Count; i++)
{
HttpCookie cookie = Request.Cookies[i];
if (cookie.Name == ".MVCAUTH")
{
cookieFound = true;
authCookie = cookie;
break;
}
}
if (cookieFound)
{
// Extract the roles from the cookie, and assign to our current principal, which is attached to the HttpContext.
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket), ticket.UserData.Split(';'));
}
}
catch (Exception ex)
{
throw;
}
}
protected void Application_AuthenticateRequest()
{
var returnUrl = Request.QueryString["ReturnUrl"];
if (!Request.IsAuthenticated &&
!String.IsNullOrWhiteSpace(returnUrl))
{
var returnUrlCookie = new HttpCookie(".MVCRETURNURL", returnUrl) {HttpOnly = true};
Response.Cookies.Add(returnUrlCookie);
}
}
वेब।config
<!--<authorization>
<deny users="?"/>
</authorization>-->
<authentication mode="Forms">
<forms name=".MVCAUTH" loginUrl="~/WinLogin/WinLogin2.aspx" timeout="30" enableCrossAppRedirects="true"/>
</authentication>
<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
<providers>
<add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADService" connectionProtection="Secure" enablePasswordReset="false" enableSearchMethods="true" requiresQuestionAndAnswer="true" applicationName="/" description="Default AD connection" requiresUniqueEmail="false" clientSearchTimeout="30" serverSearchTimeout="30" attributeMapPasswordQuestion="department" attributeMapPasswordAnswer="division" attributeMapEmail="mail" attributeMapUsername="sAMAccountName" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" passwordAnswerAttemptLockoutDuration="30" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1"/>
</providers>
</membership><machineKey decryptionKey="..." validationKey="..." /> </system.web><connectionStrings> <add name="ADService" connectionString="LDAP://SERVER:389"/></connectionStrings>
क्रेडिट http://msdn.microsoft.com/en-us/library/ms972958.aspx
जानकारी और लिंक के लिए धन्यवाद। मै उसे करने की एक कोशिश तो करूंगा। –
यह एकीकृत मोड का उपयोग करके आईआईएस 7 में काम नहीं करेगा: http://stackoverflow.com/questions/289317/iis7-and-authentication-problems –
मैंने पाया कि यह भी गैरी है। मैं अभी भी इसके लिए एक समाधान ढूंढ रहा हूं क्योंकि मेरे पास दो एमवीसी अनुप्रयोग हैं जिन्हें इस कार्यक्षमता की आवश्यकता होगी। –