我正在开发一个ASP.Net MVC4 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;
}
这段代码在我以前的MVC3应用程序中工作得很好,但是在这个MVC4应用程序中,在Razor视图中,以下代码似乎没有访问IsInRole属性来执行角色检查
@if (HttpContext.Current.User.IsInRole("Applicant"))
{
<p>text</text>
}
同样,这在我的MVC3应用程序中工作得很好。
有没有人有任何想法或建议来解释为什么这不适用于我的MVC4应用程序?
任何帮助都是非常感谢的。
谢谢。
额外信息
我的MVC4应用程序使用的是.Net Framework4.0
下面的屏幕截图显示了分配给Context.User.的通用主体您可以看到,对于此用户,m_roles包含两个字符串:UserID (100170)及其Role(Applicant).但是由于某些原因,IsInRoles无法在我的MVC 4剃刀视图中访问或查看,但是,它可以在我相同的MVC 3剃刀视图中访问或查看。
发布于 2013-02-11 19:16:10
乡亲们
我终于解决了这个问题。当您创建一个新的ASP.NET MVC4应用程序时,默认情况下SimpleMembershipProvider处于启用状态。我不想在这种情况下使用SimpleMembershipProvider,但是,我需要在我的web配置中使用以下代码来禁用它
<appSettings>
<add key="enableSimpleMembership" value="false" />
</appSettings>
我给User.IsInRole打的电话现在工作得很好。
希望这对其他人有帮助。
发布于 2013-02-10 20:55:16
在MVC4中,您可以从WebPageRenderingBase
访问User
,因此在Razor语法中,您可以直接访问User
实例:
@if (Request.IsAuthenticated && User.IsInRole("Applicant"))
{
<p>text</p>
}
我看到您正在手动创建FormsAuthenticationTicket
和HttpCookie
。使用SetAuthCookie(string, bool[, string])
,FormsAuthentication类将为您完成此操作。从这个意义上说,您的身份验证服务可以简化为:
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_AuthenticateRequest
更改为Application_OnPostAuthenticateRequest
protected void Application_OnPostAuthenticateRequest(Object sender, EventArgs e)
发布于 2013-02-11 04:23:06
在MVC4中,HttpContext.Current.User没有公开,所以你不能使用它。我所做的是创建一个自定义BaseViewPage,并在其中添加以下代码。
public abstract class BaseViewPage : WebViewPage
{
public virtual new Principal User
{
get { return base.User as Principal; }
}
}
public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
public virtual new Principal User
{
get { return base.User as Principal; }
}
}
然后对视图文件夹中的web.config的system.web.webPages.razor/pages部分进行以下更改。
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="WebApp.Views.BaseViewPage">
<namespaces>
...
</namespaces>
</pages>
希望这能解决你的问题。
https://stackoverflow.com/questions/14772034
复制相似问题