- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个 Intranet 应用程序,其中用户身份验证基于 Active Directory,并且我对处理用户声明的正确方法有疑问。
我已经实现了类似的东西
Using OWIN and Active Directory to authenticate users in ASP.Net MVC 5 application
并且它完美地工作以通过事件目录对用户进行身份验证。我已添加声明以将用户数据存储在 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
...这看起来很无语。
最佳答案
您可以使用扩展方法来提供您需要的方法。
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);
关于c# - Owin Authentication and claims in asp.net 如何访问用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39346134/
This question already has answers here: Using Variable for Thread group Ramp up time (3个答案) 3年前关闭。 从
我希望使用 RPyC 为硬件板提供 API 作为服务。该板一次只能满足一个用户的需求。有什么方法可以让 RPyC 强制执行一次只有一个用户可以访问吗? 最佳答案 我不确定这是否有效(或有效),但您可以
如果我想以每秒 10 个请求运行测试。如何让 Jmeter 选择每秒处理该请求数所需的最佳线程数。 我将线程数设置为与每秒请求数相同。 最佳答案 您可以使用恒定吞吐量计时器 click here你只需
我正在尝试进行查询以检查客户表并返回过去 30 天、过去 365 天和所有时间具有特定值的用户数。 所有时间的计数很简单: $stmt = $conn->prepare("SELECT count(i
我是一名优秀的程序员,十分优秀!