通过捕获客户的服务帐户名

时间:2018-01-28 17:23:03

标签: asp.net-mvc authentication asp.net-web-api

全部,我在我的一个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);
                }
            }
    }

1 个答案:

答案 0 :(得分:1)

您是否在服务器上的IIS中设置了Windows Auth? IIS Windows Auth提供程序也必须存在(Negotiate,NTLM)以允许IIS尝试使用AD进行身份验证。