我公司正在使用LDAP对其用户进行身份验证。我有登录部分工作,但现在我需要一种方式,一旦登录,我们可以引用用户。我尝试了多种方式,但没有一种方法可行。
以下是我用来登录的代码:
var x = Membership.Provider;
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
string userId = Membership.GetUser().ProviderUserKey.ToString();
return RedirectToAction("Index", "Home");
}
}
在这一行:
string userId = Membership.GetUser().ProviderUserKey.ToString();
我收到错误:
参数'username'不能为空。
我也从这里尝试了几个选项:
How can I access UserId in ASP.NET Membership without using Membership.GetUser()?
喜欢这个:
MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
我得到了同样的错误
对于任何想知道的人,iamtooamazing建议如下:
string userId = Membership.GetUser(model.UserName).ProviderUserKey.ToString();
这可以在这种方法中起作用。但是,我无法在解决方案的任何其他地方使用它。我需要一些适用于所有控制器(及其中的方法)的东西
使用此代码:
string user = ((CustomIdentity)User.Identity).UserId;
我在该行收到此错误:
无法投射类型的对象 输入'System.Security.Principal.GenericIdentity' 'STCAuthentication.Models.CustomIdentity'。
这是我的代码的当前状态:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var x = Membership.Provider;
if (Membership.ValidateUser(model.UserName, model.Password))
{
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
string user = ((CustomIdentity)User.Identity).UserId;
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
答案 0 :(得分:0)
这可以在这种方法中起作用。但是,我将无法使用 在解决方案的任何其他地方。我需要一些可以工作的东西 所有控制器(及其中的方法)
如果您创建存储用户ID的自定义标识呢?
public class CustomIdentity : IIdentity
{
private IIdentity Identity { get; set; }
public string UserId { get; private set; }
public string AuthenticationType { get { return Identity.AuthenticationType; } }
public bool IsAuthenticated { get { return Identity.IsAuthenticated; } }
public string Name { get { return Identity.Name; } }
public CustomIdentity(IIdentity identity)
{
Identity = identity;
UserId = Membership.GetUser(identity.Name).ProviderUserKey.ToString();
}
}
创建一个CustomPrincipal,
public class CustomPrincipal : IPrincipal
{
private IPrincipal Principal;
public IIdentity Identity { get; private set; }
public bool IsInRole(string role) { return Principal.IsInRole(role); }
public CustomPrincipal(IPrincipal principal)
{
Principal = principal;
//this force the load of the userid
Identity = new CustomIdentity(principal.Identity);
}
}
然后在Global.asax中设置
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{
var principal = new CustomPrincipal(HttpContext.Current.User);
HttpContext.Current.User = principal;
}
}
您可以像这样访问您的UserId
((CustomIdentity)User.Identity).UserId //In Controllers
((CustomIdentity)HttpContext.Current.User.Identity).UserId //Inside classes
这是你想要的吗?