2014-09-12 5 views
4

У меня есть AccountController, где пользователи могут войти в систему, и область с именем Admin, где пользователи должны быть авторизованы для просмотра. Когда пользователи войти с правильным именем пользователя и Pw, он снова перенаправляет на той же странице (.../Account/Login? ReturnUrl =% 2FAdmin)MVC Redirect после входа в систему

AccountController

public class AccountController : Controller 
    { 
     [AllowAnonymous] 
     public ActionResult Login() 
     { 
      return View(); 
     } 
     [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(LoginModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (model.Username == "User" && model.Password == "Pa$$W0rd") 
       { 
        FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe); 
        if (!string.IsNullOrWhiteSpace(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        return RedirectToAction("Index", "Admin", new { area = "Admin"}); 
       } 
       ModelState.AddModelError("", "Brukernavn og/eller passord er feil"); 
      } 
      return View(); 
     } 
} 

AdminController в админке

[Authorize] 
public class AdminController : HimmelhoytControllerBase 
{ 
     public ActionResult Index() 
     { 
      return View(); 
     } 
} 

Просмотр Войти

@model Himmelhoyt.Models.AccountModels.LoginModel 
@{ 
    ViewBag.Title = "Logg inn"; 
} 
    @using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "form-signin" })) 
    { 
     < text> 
      @Html.AntiForgeryToken() 

      @Html.LabelFor(m => m.Username, new { @class = "sr-only" }) @Html.EditorFor(m => m.Username, new { htmlAttributes = new { @class = "form-control", placeholder = "Brukernavn", autofocus = "autofocus" } }) 
      @Html.ValidationMessageFor(m => m.Username, "", new { @class = "bg-danger validationMessage" }) 

      @Html.LabelFor(m => m.Password, new { @class = "sr-only" }) @Html.EditorFor(m => m.Password, new { htmlAttributes = new { @class = "form-control", placeholder = "Passord", type = "password" } }) 
      @Html.ValidationMessageFor(m => m.Password, "", new { @class = "bg-danger validationMessage" }) 
      <br/> 
      @Html.EditorFor(x => [email protected]*, new { htmlAttributes = new { @class = "checkbox" } }*@) @Html.LabelFor(m => m.RememberMe) 
      @Html.ValidationMessageFor(m => m.RememberMe) 
      <br /> 
      @Html.Submit("Logg på", new { @class = "btn btn-lg btn-primary btn-block" }) 

      @Html.ValidationSummary(true) 
     </text> 
    } 

В счетах-контроллере, вернуть RedirectToAction ("Ind ex "," Admin ", новый {area =" Admin "}); выполняется, но, как я уже сказал, он перенаправляется только на одну страницу.

EDITED Web.config

<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    </configSections> 
    <connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Himmelhoyt-20140831071527.mdf;Initial Catalog=aspnet-Himmelhoyt-20140831071527;Integrated Security=True" providerName="System.Data.SqlClient" /> 
    <add name="HimmelhoytDb" connectionString="data source=(localdb)\v11.0;initial catalog=Himmelhoyt;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <appSettings> 
    <add key="webpages:Version" value="3.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 
    <system.web> 
    <!--<authentication mode="None" />--> 
    <authentication mode="Forms"> 
     <forms loginUrl="/Account/Login" /> 
    </authentication> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
    </modules> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 
+2

В чем вопрос? – DavidG

+0

Измените свой «RedirectToAction» на какую страницу вы будете перенаправлены после log.in .. Вы помещаете там «Index», «Admin», чтобы вы возвращались к индексу Admin. : 3 – bot

+0

Проверьте отладчик, какое значение имеет переменная 'returnUrl'. если 'return Redirect (returnUrl);' выполняется, а returnUrl верен (я имею в виду, что URL не равен «/ Account/Login»), проверьте, правильно ли настроены файлы cookie. –

ответ

3

Попытка удалить следующие строки из вашего Web.config

<modules> 
    <remove name="FormsAuthentication" /> 
</modules> 
-2

Ваш эта строка кода return RedirectToAction("Index", "Admin", new { area = "Admin"});

может бросать исключение. Попробуйте

  1. положить попытку поймать и посмотреть, что является исключением.
  2. Вы передаете значение, но ваш индексный метод в Admin не принимает никаких параметров. Проверь это.
+0

Исключение не выбрасывается. Парам говорит, что он должен пойти в область с именем Admin, я думаю. Я также попробовал вернуть Redirect («~/Admin»), потому что это маршрут для моего Admin-index. – AnM

0

Попробуйте это:

шаг этот метод от контроллера Account к Admin контроллера:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (model.Username == "User" && model.Password == "Pa$$W0rd") 
      { 
       FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe); 
       if (!string.IsNullOrWhiteSpace(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       return RedirectToAction("Index", "Admin", new { area = "Admin"}); 
      } 
      ModelState.AddModelError("", "Brukernavn og/eller passord er feil"); 
     } 
     return View(); 
    } 

И изменить вызов контроллера в вашем Вид с:

@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "form-signin" })) 

в :

@using (Html.BeginForm("Login", "Admin", FormMethod.Post, new { @class = "form-signin" })) 

Затем измените строку в метод перемещен в контроллер администратора от:

return View(); 

к:

return Redirect("Index"); 

Смотрите, если он работает и соответствует вашим потребностям

+0

Я думаю, проблема в том, что файлы cookie не установлены. Метод должен работать в том месте, где у меня есть, потому что я следую примеру, где это делается и работает. – AnM

0

Если Я прав, я вижу, что вы устанавливаете SetAuthCookie, если пользователь предоставляет правильные учетные данные, но вы еще не подписались. из-за этого вы всегда перенаправляетесь на страницу входа.

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

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (model.Username == "User" && model.Password == "Pa$$W0rd") 
      { 
       FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe); 

       //Sign in code should go here. 

       if (!string.IsNullOrWhiteSpace(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       return RedirectToAction("Index", "Admin", new { area = "Admin"}); 
      } 
      ModelState.AddModelError("", "Brukernavn og/eller passord er feil"); 
     } 
     return View(); 
    } 

Какой метод аутентификации вы использовали в своей заявке? Является ли это основой для идентификации Asp.net?

Надеюсь, что это поможет.

+0

О, я чувствую себя настолько глупо. Я пытаюсь сделать что-то, что я узнал на курсе несколько недель назад, и в его программе у него нет никакого кода между FormAut .. и if-statement, который работает. Является ли система Asp.net Identity чем-то рекомендуемой для новичков? Тогда я должен посмотреть на это. – AnM

+0

Да, если вы используете новейшие технологии, я имею в виду выше .net framework 4.5 и Visual studio 2012, 2013, я настоятельно рекомендую использовать систему идентификации. Вы можете найти все необходимые примеры здесь: http://www.asp.net/identity. Если вы думаете, что вы ищете, отметьте как ответ. – DSR

0

Я не знаю, если это нормально, но для вашей проблемы я сделал это ..

case SignInStatus.Success: 
return RedirectToAction("RedirectLogin", new {ReturnUrl = returnUrl}); 

public ActionResult RedirectLogin(string returnUrl) 
     { 

      return User.IsInRole("Reader") ? RedirectToAction("Index", "Employees") : RedirectToLocal(returnUrl); 
        } 

и если вы делаете не хотите, чтобы это было «Домой» «Индекс» по умолчанию, измените это

private ActionResult RedirectToLocal(string returnUrl) 
     { 
      if (Url.IsLocalUrl(returnUrl)) 
      { 
       return Redirect(returnUrl); 
      } 
      return RedirectToAction("Dashboard", "User"); 
     } 

Все, что у вас есть в Контроллере счетов, надеюсь, что это поможет.

0
public static string securityIsnuul(string id) 
{ 
    agancyEntities db = new agancyEntities(); 

    if (id == null) 
    { 
     //// redirect to url?????? 
    }  
} 
+0

Не могли бы вы расширить этот ответ, включив объяснение, почему вы думаете, что это решит проблему? – Taegost

+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – Isma

Смежные вопросы