gpt4 book ai didi

wcf - 在哪里 Hook 到 WCF 管道以从传入的 HTTP 请求 header 中提取 UserNamePasswordValidator 的凭据

转载 作者:行者123 更新时间:2023-12-04 15:26:20 25 4
gpt4 key购买 nike

任何人都可以给我指出一个合适的 WCF 扩展点,以便连接到 WCF 管道以从传入的 HTTP REST 请求的 header 中提取 UserNamePasswordValidator 的凭据吗?

是的,我知道有关 Http 处理程序等的所有时髦特技。您可以拉动以某种方式使基本/摘要身份验证正常工作,但由于我正在使用的客户端将严格基于 Javascript,因此我选择了一个简单的模型,其中凭据是使用两个自定义 header 通过 SSL 管道传递。

最佳答案

更新 :我已经通过使用 here 描述的方法设法改进了这一点.虽然这不能解决我的问题中描述的问题,但它不必在授权策略中进行身份验证,因为身份验证现在由自定义 AuthenticationManager 处理,完全绕过 UsernamePasswordValidator。

目前我已经通过在自定义授权策略中结合身份验证和授权解决了这个问题。我仍然宁愿找到一种方法来连接正常的 UserNamePasswordValidator 身份验证方案,因为授权策略应该是授权而不是身份验证。

internal class RESTAuthorizationPolicy : IAuthorizationPolicy
{
public RESTAuthorizationPolicy()
{
Id = Guid.NewGuid().ToString();
Issuer = ClaimSet.System;
}

public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
const String HttpRequestKey = "httpRequest";
const String UsernameHeaderKey = "x-ms-credentials-username";
const String PasswordHeaderKey = "x-ms-credentials-password";
const String IdentitiesKey = "Identities";
const String PrincipalKey = "Principal";

// Check if the properties of the context has the identities list
if (evaluationContext.Properties.Count > 0 ||
evaluationContext.Properties.ContainsKey(IdentitiesKey) ||
!OperationContext.Current.IncomingMessageProperties.ContainsKey(HttpRequestKey))
return false;

// get http request
var httpRequest = (HttpRequestMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpRequestKey];

// extract credentials
var username = httpRequest.Headers[UsernameHeaderKey];
var password = httpRequest.Headers[PasswordHeaderKey];

// verify credentials complete
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
return false;

// Get or create the identities list
if (!evaluationContext.Properties.ContainsKey(IdentitiesKey))
evaluationContext.Properties[IdentitiesKey] = new List<IIdentity>();
var identities = (List<IIdentity>) evaluationContext.Properties[IdentitiesKey];

// lookup user
using (var con = ServiceLocator.Current.GetInstance<IDbConnection>())
{
using (var userDao = ServiceLocator.Current.GetDao<IUserDao>(con))
{
var user = userDao.GetUserByUsernamePassword(username, password);

...

关于wcf - 在哪里 Hook 到 WCF 管道以从传入的 HTTP 请求 header 中提取 UserNamePasswordValidator 的凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com