全部,我在我的一个web api控制器操作上实现授权时遇到问题。这是一个.net框架4.6.1 app和一个MVC 5应用程序调用这个web api。 我们在客户端(MVC5)和web api上实现了Windows身份验证。客户端和服务器都使用相同的服务帐户(应用程序池运行的帐户名称),这些帐户位于不同的服务器上。
客户端应用程序的用户在访问调用web api的MVC应用程序部分之前使用AD帐户进行身份验证。
我将[Authorize]属性添加到api控制器操作中,但返回的请求有401未授权状态。
因此,我添加了一个自定义授权逻辑,用于比较来自客户端应用程序的传入用户名(服务帐户),以及在api的配置文件(在每个环境中)中配置的内容以及接受/拒绝请求。行上的用户(请参阅下面的代码)actionContext.RequestContext.Principal.Identity.Name是一个空字符串。
我尝试在IIS上的MVC5应用配置上启用asp.net模拟,但仍然没有运气
有没有人做过类似的事情?
自定义授权逻辑
public class CustomAuthorize : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var isAuthorized = false;
var environment = ConfigurationManager.AppSettings["Env"];
var configuredAccountName = ConfigurationManager.AppSettings["appserviceaccountname"];
string incomingServiceAccountName = null;
try
{
if(actionContext.RequestContext.Principal != null && actionContext.RequestContext.Principal.Identity != null)
{
incomingServiceAccountName = actionContext.RequestContext.Principal.Identity.Name;
if(!string.IsNullOrWhiteSpace(incomingServiceAccountName))
{
logger.Error(string.Format("Service account name passed in is : {0}", incomingServiceAccountName));
switch (environment)
{
case "Dev":
if(incomingServiceAccountName.ToLower().Equals(configuredAccountName.ToLower()))
{
isAuthorized = true;
}
break;
default:
break;
}
}
}
else if(actionContext.RequestContext.Principal == null)
{
logger.Error("Principal is null");
}
else
{
logger.Error("Identity is null");
}
}
catch (Exception ex)
{
logger.Error(string.Format("Error occurred while authorizing the user inside the class CustomAuthorize and method IsAuthorized with {0}", ex.Message));
isAuthorized = false;
}
return isAuthorized;
}
}
进行api调用的MVC5客户端代码
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://webapiurl");
var jsonString = new StringContent(JsonConvert.SerializeObject(search), Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.PostAsync(client.BaseAddress, jsonString).Result;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
mydate = JsonConvert.DeserializeObject<List<mydate>>(result);
}
}
}
答案 0 :(得分:1)
您是否在服务器上的IIS中设置了Windows Auth? IIS Windows Auth提供程序也必须存在(Negotiate,NTLM)以允许IIS尝试使用AD进行身份验证。