0

Привет Я написал пользовательскую систему аутентификации для моего приложения ASP.NET MVC.Ролевая пользовательская система аутентификации в ASP.NET MVC, направляющая на ошибку

Так изменения, которые я сделал, как После

В Global.asax.cs Файл добавил следующий метод

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

} 
protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e) 
{ 
try 
{ 
    if (FormsAuthentication.CookiesSupported == true) 
    { 
    if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) 
    { 
     try 
     {        
      string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name; 
      string roles = string.Empty; 

      if(!string.IsNullOrEmpty(username)) 
      { 
       // user --> Roles Getting from DB using Stored Procdure 

       roles = user.RoleName; 
      } 

      e.User = new System.Security.Principal.GenericPrincipal(
       new System.Security.Principal.GenericIdentity(username, "Forms"), roles.Split(';')); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 
} 
catch (Exception) 
{ 
    throw; 
} 

}

в Web.Config

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

в FilterConfig.cs в App_Start Папка

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 
} 

в методе контроллера Вход

[AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 

    // POST: /Account/Login 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginUserViewModel loginmodel, string returnUrl) 
    { 
     try 
     { 
      UserViewModel userdata=null; 

      if (loginmodel.UserName != null & loginmodel.Password != null) 
      { 
       // Get userData via Stored Procedure 



       if (userdata != null) 
       {                      

        FormsAuthentication.SetAuthCookie(loginmodel.UserName, false); 
        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
         && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Dashboard", "Home"); 
        } 


       } 
       else 
       { 
        ModelState.AddModelError("", "Login failed."); 
       } 

      } 
      else 
      { 
       ModelState.AddModelError("", "Login failed."); 
      } 

      return View(userdata); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

Login.cshtml страница

   @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
       { 
        @Html.AntiForgeryToken() 
        @* rest of data *@ 
        @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

        <div class="form-group "> 
         <div class="col-sm-12 col-lg-12 col-md-12"> 
          <button type="submit" >Login</button> 
         </div> 
        </div> 
       } 

Наконец в HomeController.cs

[Authorize(Roles="admin")] 
    public ActionResult Dashboard() 
    { 
     //rest of fetching 
    } 

Здесь все работало отлично, но я Нечаянно Debuged/Run Dashboard Посмотреть страницу без Войти,

Теперь я в конечном итоге с следующей ошибкой в ​​FormsAuthentication_OnAuthenticate методом в Global.asax Файл,

Ссылка на объект не установлена ​​в экземпляр объекта.

Теперь, когда я Запуск отладки этого проекта его окончание там

+0

Какая строка бросает исключение ссылки на объект внутри 'FormsAuthentication_OnAuthenticate'? Кажется, что переменная пытается назначить нулевую ссылку из другого объекта. –

+0

@TetsuyaYamamoto получить ошибку, например, следующим образом http://i.imgur.com/jJb18Mi.png –

ответ

0

ваш атрибут авторизовать не использует реализацию, что вы создали, вы должны действительно сделали в пользовательских AuthoriseAttribue, что наследует AuthorizeAttribute

что-то подобное с вашим собственным кодом получать роли и аутентификации

public class AuthorizeUserAttribute : AuthorizeAttribute 
{ 
.... 
//your code here 
} 

, а затем ваш ViewModel \ Модель должна выглядеть следующим образом

[AuthorizeUserAttribute(Roles="admin")] 
public ActionResult Dashboard() 
{ 
    //rest of fetching 
} 
+0

Мне нужно создать новый класс как 'AuthorizeUserAttribute'? –

+0

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

+0

, где я должен помещать этот класс 'AuthorizeUserAttribute' внутри какого-либо specfic-местоположения?, мой метод контроллера Dashboard в классе Home Controller –

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