Asp.net mvc 3 MVC3表单身份验证:部分视图中特定于角色的可见项

Asp.net mvc 3 MVC3表单身份验证:部分视图中特定于角色的可见项,asp.net-mvc-3,cookies,forms-authentication,partial-views,Asp.net Mvc 3,Cookies,Forms Authentication,Partial Views,我刚刚用forms身份验证设置了我的MVC应用程序,除了我的\u LogOnPartial视图之外,其他一切都很好。“Welcome[Log Off]”可以正常工作,但是,我还需要根据用户的角色显示特定于角色的文本或下拉选择器 只要用户在当前会话期间登录,这就可以正常工作,因为在任何操作发生之前,我使用Cookie来保持角色并在控制器中使用user.IsInRole()进行验证 如果用户选择“记住我”,这将不起作用,因为当会话启动时,没有包含角色的cookie,因此也没有可见项 是否有一种简单的

我刚刚用forms身份验证设置了我的MVC应用程序,除了我的
\u LogOnPartial
视图之外,其他一切都很好。“Welcome[Log Off]”可以正常工作,但是,我还需要根据用户的角色显示特定于角色的文本或下拉选择器

只要用户在当前会话期间登录,这就可以正常工作,因为在任何操作发生之前,我使用Cookie来保持角色并在控制器中使用
user.IsInRole()
进行验证

如果用户选择“记住我”,这将不起作用,因为当会话启动时,没有包含角色的cookie,因此也没有可见项

是否有一种简单的方法可以在局部视图中检查
User.IsInRole()

以下是我的看法:

<div id="LogInContainer">
    @if (Request.IsAuthenticated)
    {
        <div class="InLine" id="WelcomeDisplay">
            <text>Welcome <b>@Context.User.Identity.Name</b>! [ @Html.ActionLink("Log Off", "LogOff", "Account")
            ]
            </text>
        </div>
        <div id="clientDropDown">
            @{

        var requestCookie = Request.Cookies["Role"];
        if (requestCookie != null)
        {
            if (requestCookie.Value == "Client1")
            {
                HttpCookie joannCookie = new HttpCookie("Client", "Client1");
                Response.Cookies.Add(Client1Cookie);
                <text>Client: Client1</text>
            }
            else if (requestCookie.Value == "Client2")
            {
                HttpCookie safewayCookie = new HttpCookie("Client", "Client2");
                Response.Cookies.Add(Client2Cookie); 
                <text>Client: Client2</text>
            }
            else if (requestCookie.Value == "Administrator")
            {
                @:Client: @Html.DropDownList("Client", new SelectList(ConfigurationHelper.Clients))
                }
        }
        else
        {
            //Do nothing
        }
            }
        </div>
    }
    else
    {
        <div id="LogOnLink">
            [ @Html.ActionLink("Log On", "LogOn", "Account") ]
        </div>
    }
</div>

@如果(请求已验证)
{
欢迎@Context.User.Identity.Name![@Html.ActionLink(“注销”、“注销”、“帐户”)
]
@{
var requestCookie=Request.Cookies[“角色”];
if(requestCookie!=null)
{
if(requestCookie.Value==“Client1”)
{
HttpCookie joannCookie=新的HttpCookie(“客户端”、“客户端1”);
响应.Cookies.添加(Client1Cookie);
客户:客户1
}
else if(requestCookie.Value==“Client2”)
{
HttpCookie safewayCookie=新的HttpCookie(“客户端”、“客户端2”);
响应.Cookies.Add(Client2Cookie);
客户:客户2
}
else if(requestCookie.Value==“管理员”)
{
@:Client:@Html.DropDownList(“客户端”,新选择列表(ConfigurationHelper.Clients))
}
}
其他的
{
//无所事事
}
}
}
其他的
{
[@Html.ActionLink(“登录”、“登录”、“帐户”)]
}

有没有办法让nonauth Cookie持久化?我对cookie还不熟悉,所以我可能只是无知,但我尝试了谷歌搜索,但没有成功。

将cookie的过期日期设置为未来的某个日期,以使其持续。如果未设置过期日期,则浏览器不会将其存储在磁盘上,并且仅在使用同一浏览器会话时才会保留该cookie,即所谓的“会话cookie”或“非持久性”cookie。如果你想“永远”保存cookie,你仍然必须选择一个日期,你唯一能做的就是选择一个在未来“足够远”的到期日期(例如,当前日期加上一个大的固定时间跨度)


但是,在持久cookie中存储身份验证或授权信息时应该非常小心!默认情况下,ASP.NET使用会话cookie进行身份验证,因为持久化此类cookie会带来严重的安全风险。

持久化cookie的典型持续时间是多少?例如,ASP.NET表单用于身份验证Cookie的是什么?通常您不会持久化身份验证Cookie,因为这被认为是非常危险的。如何持久化身份验证(登录)信息?我使用默认的asp.net MVC3网站身份验证,使用System.Web.Security.FormsAuthentication:
FormsAuthentication.SetAuthCookie(用户名,createPersistentCookie)确定,cookie过期时间是根据web.config中为表单身份验证配置的超时时间设置的。请参阅system.web/authentication/forms/@timeout属性。默认情况下为30分钟,因此cookie过期日期将为DateTime。现在为+30分钟。如果使用滑动过期(这是默认值),cookie将随每个请求更新,因此只有在空闲30分钟后才会超时。只有在您明确表示的情况下(在SetAuthCookie中传递true),才会设置cookie的过期日期(以持久保存cookie)。感谢您提供的所有信息!现在,如果我对我的其他cookie使用过期日期,它们的行为是否与空闲超时类似,还是从创建日期/时间开始过期?我假设是后者,如果是这样,有没有办法模仿超时特性?