问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何:创建自定义安全令牌身份验证器

发布网友 发布时间:2022-05-02 01:52

我来回答

1个回答

热心网友 时间:2022-04-23 01:23

重写CanValidateTokenCore 方法。此方法返回 true 或false,具体取决于自定义身份验证器是否可以验证传入的令牌类型。重写ValidateTokenCore 方法。此方法需要适当地验证令牌内容。如果此令牌通过验证步骤,它将返回 IAuthorizationPolicy 实例的集合。下面的示例使用将在后面的过程中创建的自定义授权策略实现。 Visual Basic FriendClass MySecurityTokenAuthenticator Inherits SecurityTokenAuthenticator ProtectedOverridesFunction CanValidateTokenCore(ByVal token As SecurityToken) AsBoolean ' Check that the incoming token is a username token type that ' can be validated by this implementation. Return (TypeOf token Is UserNameSecurityToken) EndFunctionProtectedOverridesFunction ValidateTokenCore(ByVal token As SecurityToken) As ReadOnlyCollection(Of IAuthorizationPolicy) Dim userNameToken = TryCast(token, UserNameSecurityToken) ' Validate the information contained in the username token. For demonstration ' purposes, this code just checks that the user name matches the password. If userNameToken.UserName userNameToken.Password ThenThrowNew SecurityTokenValidationException("Invalid user name or password") EndIf ' Create just one Claim instance for the username token - the name of the user. Dim userNameClaimSet AsNew DefaultClaimSet(ClaimSet.System, _ New Claim(ClaimTypes.Name, _ userNameToken.UserName, _ Rights.PossessProperty)) Dim policies AsNew List(Of IAuthorizationPolicy)(1) policies.Add(New MyAuthorizationPolicy(userNameClaimSet)) Return policies.AsReadOnly() EndFunctionEndClass C# internal class MySecurityTokenAuthenticator : SecurityTokenAuthenticator { protected override bool CanValidateTokenCore(SecurityToken token) { // Check that the incoming token is a username token type that // can be validated by this implementation.return (token is UserNameSecurityToken); } protected override ReadOnlyCollection ValidateTokenCore(SecurityToken token) { UserNameSecurityToken userNameToken = token as UserNameSecurityToken; // Validate the information contained in the username token. For demonstration // purposes, this code just checks that the user name matches the password.if (userNameToken.UserName != userNameToken.Password) { throw new SecurityTokenValidationException("Invalid user name or password"); } // Create just one Claim instance for the username token - the name of the user. DefaultClaimSet userNameClaimSet = new DefaultClaimSet( ClaimSet.System, new Claim(ClaimTypes.Name, userNameToken.UserName, Rights.PossessProperty)); List policies = new List(1); policies.Add(new MyAuthorizationPolicy(userNameClaimSet)); return policies.AsReadOnly(); } } 前面的代码返回集合中的授权策略的 CanValidateToken(SecurityToken) 方法。WCF 不提供此接口的公共实现。下面的过程演示如何针对您自己的要求实现此目的。创建自定义授权策略定义一个实现 IAuthorizationPolicy 接口的新类。实现Id 只读属性。实现此属性的一个方法是在类构造函数中生成一个全局唯一标识符 (GUID),并在每次请求此属性的值时返回该标识符。实现Issuer 只读属性。此属性需要返回从令牌获取的声明集的颁发者。此颁发者应该与令牌颁发者负责验证令牌内容的颁发机构相对应。下面的示例使用了颁发者声明,该声明从前面的过程中创建的自定义安全令牌身份验证器传递给此类。自定义安全令牌身份验证器使用系统提供的声明集(由 System 属性返回)来表示用户名令牌的颁发者。实现Evaluate 方法。此方法使用基于传入安全令牌内容的声明来填充 EvaluationContext 类的实例(以参数形式传入)。当此方法完成计算时返回 true。如果该实现依赖于为计算上下文提供附加信息的其他授权策略,则在计算上下文中不存在所要求的信息时,此方法可返回 false。在这种情况下,如果这些授权策略之中至少有一个修改了计算上下文,WCF 在计算为传入消息生成的所有其他授权策略后,将再次调用此方法。 Visual Basic FriendClass MyServiceCredentialsSecurityTokenManager Inherits ServiceCredentialsSecurityTokenManager Private credentials As ServiceCredentials PublicSubNew(ByVal credentials As ServiceCredentials) MyBase.New(credentials) Me.credentials = credentials EndSubPublicOverridesFunction CreateSecurityTokenAuthenticator(ByVal tokenRequirement As SecurityTokenRequirement, _ _ ByRef outOfBandTokenResolver _ As SecurityTokenResolver) As SecurityTokenAuthenticator ' Return your implementation of the SecurityTokenProvider based on the ' tokenRequirement argument. Dim result As SecurityTokenAuthenticator If tokenRequirement.TokenType = SecurityTokenTypes.UserName ThenDim direction = tokenRequirement.GetProperty(Of MessageDirection)(ServiceModelSecurityTokenRequirement.MessageDirectionProperty) If direction = MessageDirection.Input Then outOfBandTokenResolver = Nothing result = New MySecurityTokenAuthenticator() Else result = MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, _ outOfBandTokenResolver) EndIfElse result = MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, _ outOfBandTokenResolver) EndIfReturn result EndFunctionEndClass C# internal class MyServiceCredentialsSecurityTokenManager : ServiceCredentialsSecurityTokenManager { ServiceCredentials credentials; public MyServiceCredentialsSecurityTokenManager(ServiceCredentials credentials) : base(credentials) { this.credentials = credentials; } public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator (SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) { // Return your implementation of the SecurityTokenProvider based on the // tokenRequirement argument. SecurityTokenAuthenticator result; if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { MessageDirection direction = tokenRequirement.GetProperty (ServiceModelSecurityTokenRequirement.MessageDirectionProperty); if (direction == MessageDirection.Input) { outOfBandTokenResolver = null; result = new MySecurityTokenAuthenticator(); } else { result = base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } } else { result = base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } return result; } } 演练:创建自定义客户端和服务凭据 说明如何创建自定义凭据和自定义安全令牌管理器。若要使用此处创建的自定义安全令牌身份验证器,可以修改安全令牌管理器的实现,以便从 CreateSecurityTokenAuthenticator 方法返回自定义身份验证器。当传入适当的安全令牌要求时,该方法将返回身份验证器。 Visual Basic FriendClass MyAuthorizationPolicy Implements IAuthorizationPolicy Private _id AsStringPrivate _tokenClaims As ClaimSet Private _issuer As ClaimSet PublicSubNew(ByVal tokenClaims As ClaimSet) If _tokenClaims IsNothingThenThrowNew ArgumentNullException("tokenClaims") EndIfMe._issuer = tokenClaims.Issuer Me._tokenClaims = tokenClaims Me._id = Guid.NewGuid().ToString() EndSubPublicReadOnlyProperty Issuer() As ClaimSet Implements IAuthorizationPolicy.Issuer GetReturn _issuer EndGetEndPropertyPublicReadOnlyProperty Id() AsStringImplements System.IdentityModel.Policy.IAuthorizationComponent.Id GetReturn _id EndGetEndPropertyPublicFunction Evaluate(ByVal evaluationContext As EvaluationContext, _ ByRef state AsObject) AsBooleanImplements IAuthorizationPolicy.Evaluate ' Add the token claim setto the evaluation context. evaluationContext.AddClaimSet(Me, _tokenClaims) ' Returntrueif the policy evaluation is finished. ReturnTrueEndFunctionEndClass C# internal class MyAuthorizationPolicy : IAuthorizationPolicy { string id; ClaimSet tokenClaims; ClaimSet issuer; public MyAuthorizationPolicy(ClaimSet tokenClaims) { if (tokenClaims == null) { throw new ArgumentNullException("tokenClaims"); } this.issuer = tokenClaims.Issuer; this.tokenClaims = tokenClaims; this.id = Guid.NewGuid().ToString(); } public ClaimSet Issuer { get { return issuer; } } publicstring Id { get { return id; } } publicbool Evaluate(EvaluationContext evaluationContext, ref object state) { // Add the token claim set to the evaluation context. evaluationContext.AddClaimSet(this, tokenClaims); // Return true if the policy evaluation is finished.returntrue; } }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...防御里的4个都开不起来 错误的代码是80020002 80010007 煎牛排用什么肉好 茄子怎么做比较好吃呢? English tabloid手抄报 English tabloid手抄报怎么画 邓小平“南方讲话”关于发展问题最著名的观点是( )。 电脑电源输出12V、5V的作用是什么? win10手机能玩电脑游戏win10系统的手机难道可以安装和电脑一样的软件... 如何设置才能做到只能通过远程桌面访问server2003 怎样解电脑开机密码?且要保住电脑资料,请各位高手赐教,谢谢! 糖友荟糖友荟简介 ASP.netMVC 如何生成安全的发短信token 如何自己手工获取自己的AccessToken 1966的粮票价格 1966年的全国通用粮票3市斤和5市斤的市价如何? 1966年面值3市斤粮票价值多少钱一张 通用粮票1953年 5市斤价值多少 黑龙江粮票1978年三市斤价格是多少 五市斤是多少钱 易视tv机顶盒看直播遥控器失灵 小米电视遥控器怎么使用放直播? 1966年的全国粮票5市和3市斤的值多少钱一张啊 1966年全国通用粮票三市斤的能值多少钱啊 家里电视安装了宽带,有时会出现遥控器调不到直播频道,该怎么解决?_百度问一问 海信电视遥控器直播设置成一键打开软件 微课掌上通怎样在电脑上写作业,如果是要下载,请告诉我在哪里下! 微课掌上通怎样在电脑上写作业,如果是要下载,请告诉我在哪里下载 在步步高家教机h8s上下载微客掌上通 请问2013版QQ怎么取消高清头像呀,可以告诉我吗 两万一天收益多少,每天变化是多少 如何删除QQ个人资料中正在使用的头像 本人在小县城想开一家店有什么合适推荐的? 今年想在县城开个小吃店,不知道干啥好? EXCEL内容展开 小县城开什么店好? 女生在小县城开什么店合适 我想要一个Z开头好听好看点的英文名字 小县城适合开什么样的店? 怎样判断人在五行之中缺什么? 在小县城开个什么店好呢? 肌肉科技白金增肌粉怎么样,如何 我想要个英文名,简单点,最好是Z开头的,我的名字是张晓云 肌肉科技白金增肌粉和乳清蛋白有什么区别? 肌肉科技增肌粉和欧普特蒙白金增肌粉 哪个好 求具体 以z开头的女英文名? 小县城开个什么店好? olimp白金增肌粉,谁知道这个是啥 在县城里开个门店,干什么合适 肌肉科技白金增肌粉,大佬们你们怎么喝下去 在小县城适合女性开的店有哪些 瘦子增肌该如何选择增肌粉