age*_*t47 21 forms-authentication iprincipal iidentity custom-authentication asp.net-mvc-3
创建我自己的IPrincipal,并IIdentity实现如下图所示:
[ComVisible(true)]
[Serializable]
public sealed class CustomIdentity : IIdentity {
private readonly string _name;
private readonly string _email;
// and other stuffs
public CustomIdentity(string name) {
_name = name.Trim();
if(string.IsNullOrWhiteSpace(name))
return;
_email = (connect to database and read email and other stuffs);
}
public string Name {
get { return _name; }
}
public string Email {
get { return _email; }
}
public string AuthenticationType {
get { return "CustomIdentity"; }
}
public bool IsAuthenticated {
get { return !string.IsNullOrWhiteSpace(_name); }
}
}
[ComVisible(true)]
[Serializable]
public sealed class CustomPrincipal : IPrincipal {
private readonly CustomIdentity _identity;
public CustomPrincipal(CustomIdentity identity) {
_identity = identity;
}
public bool IsInRole(string role) {
return _identity != null &&
_identity.IsAuthenticated &&
!string.IsNullOrWhiteSpace(role) &&
Roles.IsUserInRole(_identity.Name, role);
}
IIdentity IPrincipal.Identity {
get { return _identity; }
}
public CustomIdentity Identity {
get { return _identity; }
}
}
Run Code Online (Sandbox Code Playgroud)
另外,我创建了一个HttpModule,在它的AuthenticateRequest事件中,我这样做:
public void Init(HttpApplication context) {
_application = context;
_application.AuthenticateRequest += ApplicationAuthenticateRequest;
}
private void ApplicationAuthenticateRequest(object sender, EventArgs e) {
var formsCookie = _application.Request.Cookies[FormsAuthentication.FormsCookieName];
var identity = formsCookie != null
? new CustomIdentity(FormsAuthentication.Decrypt(formsCookie.Value).Name)
: new CustomIdentity(string.Empty);
var principal = new CustomPrincipal(identity);
_application.Context.User = Thread.CurrentPrincipal = principal;
}
Run Code Online (Sandbox Code Playgroud)
此外,我创建自己的Controller,WebViewPage像这样:
public abstract class CustomController : Controller {
public new CustomPrincipal User {
get {
var user = System.Web.HttpContext.Current.User as CustomPrincipal;
return user;
}
}
}
public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel> {
public new CustomPrincipal User {
get {
// (Place number 1) here is the error I'm speaking about!!!
var user = HttpContext.Current.User as CustomPrincipal;
return user;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如上面的代码所示,似乎一切都是正确的; 但正如你所看到的,在1号位置我无法访问CustomPrincipal!意味着在这个地方,我有一个RolePrincipal而不是一个CustomPrincipal.例如HttpContext.Current.User是一个RolePrincipal而不是CustomPrincipal.但该RolePrincipal.Identity属性是一个CustomIdentity!
jav*_*iry 21
你的错误在这里:
_application.AuthenticateRequest += ApplicationAuthenticateRequest;
Run Code Online (Sandbox Code Playgroud)
有一个HttpModule命名RoleManagerModule调用方法HttpApplication.PostAuthenticateRequest并设置HttpContext.Current.Userto RolePrincipal.因此,您设置了User输入AuthenticateRequest并RoleManagerModule设置了它PostAuthenticateRequest,意味着在设置之后,因此覆盖您的设置.改变你的Module.Init:
public void Init(HttpApplication context) {
_application = context;
// change just this line:
_application.PostAuthenticateRequest += ApplicationAuthenticateRequest;
}
Run Code Online (Sandbox Code Playgroud)
重要更新:
如果这个问题不起作用,请再次看看这个问题 - 由启动器决定 - 依赖当前问题 - 第二个解决方案.
| 归档时间: |
|
| 查看次数: |
12102 次 |
| 最近记录: |