我有一个凭证方法来通过GenericPrincipal设置用户凭据。我正在使用asp.net MVC
public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie)
{
FormsAuthentication.SetAuthCookie(username, createPersistenceCookie);
IIdentity identity = new GenericIdentity(username);
IPrincipal principal = new GenericPrincipal(identity,new []{"standart"});
context.User = principal;
}
我想在控制器操作中检查 User.IsInRole(“standart”),但它返回false。
- context.User.IsInRole(“standart”)//返回false
我想在我的应用程序中使用 context.User ,但它总是返回false。
答案 0 :(得分:1)
我认为您以前使用过asp.net会员资格api。现在您想在应用程序中创建自定义主体。
当您向服务器发送请求时,服务器使用新的干净的HttpContext。所以你丢失了旧的信息。如果您想使用旧的会话信息是应用程序,您可以在服务器或客户端保存您的数据。你可以这两种方式做到这一点。
我建议你使用客户端cookie。因为数据存储在客户端,所以可以节省服务器资源。
public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie)
{
var formsAuthenticationTicket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now,
DateTime.Now.AddMilliseconds(FormsAuthentication.Timeout.TotalMilliseconds),
createPersistenceCookie,
roles
);
var encryptedTicket = FormsAuthentication.Encrypt(formsAuthenticationTicket);
var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContext.Current.Response.AppendCookie(authCookie);
}
我向客户端发送了加密cookie。我应该检查这个cookie所有传入服务器应用程序的请求。
现在在 Global.asax 文件中:
protected void Application_AuthenticateRequest(object sender, System.EventArgs e)
{
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null) return;
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
IIdentity identity = new GenericIdentity(ticket.Name);
IPrincipal principal = new GenericPrincipal(identity, ticket.UserData.Split('|'));
HttpContext.Current.User = principal;
}
我希望解决你的问题。