Виртуальный каталог IIS / Проверка подлинности приложений и форм - PullRequest
0 голосов
/ 30 мая 2010

Я установил и развернул простой веб-сайт для проверки подлинности с помощью членства, используя .NET 4.

Я создал виртуальный каталог (теперь преобразованный в «Приложение») в IIS7 и настроил файл web.config в виртуальном каталоге следующим образом:

<configuration>
<system.web>
<authorization>
<deny users="?">
</authorization>
* * </system.web>
<system.webServer>
* 1020 тысяча двадцать одна * </system.webServer>
</configuration>

Отлично! Я просматриваю виртуальный каталог: ../mydomain/books/

, и я автоматически перенаправляюсь на страницу входа, указанную web.config в моем корневом каталоге, и путь URL-адреса размещается следующим образом:

../Account/Login.aspx?ReturnUrl=%2fbooks

На этом этапе я успешно вхожу в систему, но меня нигде не перенаправляют, и когда я вручную возвращаюсь в каталог, ../books, я возвращаюсь на страницу входа, где я уже вошел в систему?

Так что я не понимаю, в чем моя проблема! Я должен быть успешно аутентифицирован и затем перенаправлен обратно в каталог, или, по крайней мере, иметь возможность просматривать его вручную после входа в систему, верно?

Ответы [ 2 ]

1 голос
/ 14 октября 2014

Поскольку я должен был решить это сам, я подумал, что могу также опубликовать это для других, если их поиск приведет их сюда.

Это все, что вам нужно для использования проверки подлинности с помощью форм, позволяющей анонимным пользователям предоставлять доступ к вашему форматированию, передавать учетные данные между существующим веб-сайтом .Net (.aspx) и веб-приложением MVC и перенаправлять на указанный URL после Войти.

Используйте все, что вы ищете.

Убедитесь, что ваш путь к виртуальному каталогу / виртуальному приложению для вашего веб-приложения .Net (.aspx) находится за пределами каталога Views. Также убедитесь, что вы настроили свой виртуальный каталог / приложение в IIS.

Я использовал Entity Framework и Identity с базой данных SQLServer для проверки моих пользователей.

Ваш файл web.config виртуального приложения / каталога .Net (.aspx) должен содержать следующее:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

    <!-- other stuff -->

    <system.web>
        <authentication mode="Forms">
            <forms 
                loginUrl="login.aspx" 
                name=".AUTHCOOKIE" 
                protection="All" 
                path="/" 
                domain="your_domain.com" 
                enableCrossAppRedirects="true" 
                timeout="60">
            </forms>
        </authentication>

        <authorization>
            <deny users="?" />
            <allow users="*" />
        </authorization>

        <machineKey
            validationKey="your validation key"
            decryptionKey="your decryption key"
            validation="SHA1"
            decryption="AES"
        />

        <!-- other stuff -->

    </system.web>

    <location path="/path/to/your/site.css">
        <system.web>
            <authorization>
                <allow users="?"></allow>
            </authorization>
        </system.web>
    </location>

    <!-- other stuff -->

</configuration>

Затем в коде вашей страницы login.aspx вам понадобится что-то вроде этого:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string username = Login1.UserName;
    string pwd = Login1.Password;

    /* do your authentication here
        connect to user store
        get user identity
        validate your user
        etc
    */
    if (user != null)
    {
        FormsAuthentication.SetAuthCookie(username, Login1.RememberMeSet);
        System.Web.HttpCookie MyCookie = System.Web.Security.FormsAuthentication.GetAuthCookie(User.Identity.Name.ToString(), false);
        MyCookie.Domain = "your_domain.com";
        Response.AppendCookie(MyCookie);
        Response.Redirect("~/path/to/your/index.aspx");
    }
    else
    {
        StatusText.Text = "Invalid username or password.";
        LoginStatus.Visible = true;
    }
}

Теперь добавьте в файл web.config приложений MVC:

<configuration>

    <!-- other stuff -->

    <system.web>
        <authentication mode="Forms">
            <forms 
                loginUrl="Account/Login" 
                name=".AUTHCOOKIE" 
                protection="All" 
                path="/" 
                domain="your_domain.com"
                enableCrossAppRedirects="true" 
                timeout="30"/>
        </authentication>

        <authorization>
            <deny users="?"/>
            <allow users="*"/>
        </authorization>

        <machineKey 
            validationKey="your validation key" 
            decryptionKey="your decryption key" 
            validation="SHA1" 
            decryption="AES"
        />

        <!-- other stuff -->

    </system.web>

    <location path="/path/to/your/site.css"> 
        <system.web> 
            <authorization> 
                <allow users="?"></allow> 
            </authorization> 
        </system.web>
    </location>

    <!-- other stuff -->

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="FormsAuthenticationModule"/>
            <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule"/>
            <remove name="UrlAuthorization"/>
            <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/>
        </modules>
    </system.webServer>

    <!-- other stuff -->

</configuration>

В вашем MVC AccountController метод входа в систему должен выглядеть примерно так:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        /* do your authentication here
        connect to user store
        get user identity
        validate your user
            etc
        */
        if (user != null)
        {
            await SignInAsync(user, model.RememberMe);
            FormsAuthentication.SetAuthCookie(model.Email, model.RememberMe);
            System.Web.HttpCookie MyCookie = System.Web.Security.FormsAuthentication.GetAuthCookie(User.Identity.Name.ToString(), false);
            MyCookie.Domain = "your_domain.com";
            Response.AppendCookie(MyCookie);

            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
           ModelState.AddModelError("", "Invalid username or password.");
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Наконец, ваш метод выхода из MVC AccountController таков:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    AuthenticationManager.SignOut();
    FormsAuthentication.SignOut();
    return RedirectToAction("Login", "Account");
}
0 голосов
/ 11 января 2014

Вам необходимо добавить код для перенаправления на URL-адрес «ReturnUrl», указанный в строке запроса, на странице входа в систему после входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...