ASP.Net MVC 4通用主要困难如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (93)

我正在开发一个ASP.Net MVC 4 Web应用程序。以前我的MVC应用程序是使用MVC 3开发的,而且这个新的MVC 4应用程序我刚从以前的应用程序中复制/重用了我的认证和授权代码

当用户登录到我的网站时,我执行以下操作

帐户控制器

public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        User user = _userService.GetUser(model.Email.Trim());

        //Create Pipe Delimited string to store UserID and Role(s)
        var userData = user.ApplicantID.ToString();

        foreach (var role in user.UserRoles)
        {
            userData = userData + "|" + role.description;
        }

        _formAuthService.SignIn(user.ApplicantFName, false, userData);

        return RedirectToAction("Index", "Portfolio");
        }

        return View(model);
    }

FormsAuthenticationService

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie, string UserData)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

        // Create and tuck away the cookie
        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(15), createPersistentCookie, UserData);
        // Encrypt the ticket.
        string encTicket = FormsAuthentication.Encrypt(authTicket);

        //// Create the cookie.
        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        HttpContext.Current.Response.Cookies.Add(faCookie);
    }
}

Global.asax中

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{

    // Get the authentication cookie
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    // If the cookie can't be found, don't issue the ticket
    if (authCookie == null) return;

    // Get the authentication ticket and rebuild the principal
    // & identity
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

    string[] UserData = authTicket.UserData.Split(new Char[] { '|' });

    GenericIdentity userIdentity = new GenericIdentity(authTicket.Name);
    GenericPrincipal userPrincipal = new GenericPrincipal(userIdentity, UserData);
    Context.User = userPrincipal;

}

此代码在我以前的MVC 3应用程序中运行良好,但在此Razor View中的MVC 4应用程序中,以下代码似乎无法访问IsInRole属性以执行角色检查

@if (HttpContext.Current.User.IsInRole("Applicant"))
{
    <p>text</text>
}

再次,这在我的MVC 3应用程序中完美运行。

有没有人有任何想法或建议,为什么这不会与我的MVC 4应用程序?

额外信息

我的MVC 4应用程序使用.Net Framework 4.0

下面的屏幕截图显示了我的Generic Principal被分配给Context.User。可以看到,对于此用户,m_roles包含两个字符串,UserID(100170)及其角色(申请人)。但由于某种原因,IsInRoles无法在我的MVC 4 Razor View中访问或查看,但是,它可以在我的相同MVC 3 Razor View中使用。

提问于
用户回答回答于

默认情况下,当创建新的ASP.NET MVC 4应用程序时,将显示SimpleMembershipProvider。我不想在这种情况下使用SimpleMembershipProvider,但是,我需要在我的web配置中使用以下行禁用它

<appSettings>
    <add key="enableSimpleMembership" value="false" />
</appSettings>

我现在调用User.IsInRole的效果很好。

用户回答回答于

在MVC 4中,可以访问User来自WebPageRenderingBase内部的剃须刀语法,可以直接访问该User实例:

@if (Request.IsAuthenticated && User.IsInRole("Applicant"))
{
    <p>text</p>
}

我看到你正在创建一个FormsAuthenticationTicket和一个HttpCookie手动。FormsAuthentication类可以为你使用SetAuthCookie(string, bool[, string])。从这个意义上说,你的认证服务可以简化为:

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie, string UserData)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }
}

事实证明,还需要更改Application_AuthenticateRequestApplication_OnPostAuthenticateRequest

protected void Application_OnPostAuthenticateRequest(Object sender, EventArgs e)

扫码关注云+社区

领取腾讯云代金券