在asp.net中如何进行身份验证和声明访问用户数据

本文关键字:访问 声明 用户 用户数 数据 身份验证 net asp 何进行 | 更新日期: 2023-09-27 18:05:45

我正在开发一个内部网应用程序,其中用户身份验证基于活动目录,并且在处理用户声明的正确方式方面存在问题。


我已经实现了类似的东西

在ASP中使用OWIN和Active Directory对用户进行身份验证。asp.net MVC 5应用程序

可以很好地通过活动目录对用户进行身份验证。我添加了声明来将用户数据存储在cookie

private ClaimsIdentity CreateIdentity(UserPrincipal userPrincipal)
{
   var identity = new ClaimsIdentity(MyAuthentication.ApplicationCookie, ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
   identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "Active Directory"));
   identity.AddClaim(new Claim(ClaimTypes.Name, userPrincipal.SamAccountName));
   identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userPrincipal.SamAccountName));
   identity.AddClaim(new Claim(ClaimTypes.GivenName, userPrincipal.GivenName));
   return identity;
}

是否有更有效的方法来获取用户信息,而不是下面的代码?

var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
var name = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.GivenName);

但是,用户的用户名可以通过它自己的身份获得User.Name……

在asp.net中如何进行身份验证和声明访问用户数据

你可以使用扩展方法来提供你需要的方法。

using System.Security.Claims;
using System.Security.Principal.IPrincipal;
public static class UserClaimExtentions {
  public static string GivenName(this IPrincipal user) {
    return user.GetClaimValue(ClaimTypes.GivenName);
  }
  public static string NameIdentifier(this IPrincipal user) {
    return user.GetClaimValue(ClaimTypes.NameIdentifier);
  }
  public static string GetClaimValue(this IPrincipal user, string name) {
     var claimsIdentity = user.Identity as ClaimsIdentity;
     return claimsIdentity?.FindFirst(name)?.Value;
  }
  //If you aren't using the new operators from Roslyn for null checks then
  //use this method instead
  public static string GetClaimValue(this IPrincipal user, string name) {
     var claimsIdentity = user.Identity as ClaimsIdentity;
     var claim = claimsIdentity == null ? null : claimsIdentity?.FindFirst(name);
     return claim == null ? null : claim.Value;
  }
}

现在在你的代码中你只需要确保你使用的是定义扩展类的命名空间然后你可以使用

var givenName = User.GivenName();
var identifier = User.NameIdentifier();

var givenName = User.GetClaimValue(ClaimTypes.GivenName);
var identifier = User.GetClaimValue(ClaimTypes.NameIdentifier);

如果你想在Owin中使用Windows认证,你可以从你的Startup.cs类中调用它(没有cookie认证):

public void ConfigureAuth(IAppBuilder app)
{
     HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"];
     listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;
}

那么在你有OwinContext的地方你可以直接写

var user = new OwinContext().Authentication.User;
//or
var user = HttpContext.Current.GetOwinContext().Authentication.User;