首页 > 解决方案 > profile.User.Identity.IsAuthenticated 返回 false 没有人帮助我

问题描述

我正在尝试将带有另一个项目(c#)的 Web 服务构建连接到我的项目(asp.net mvc)。目前我可以登录和注销,但我无法将查询带到我的项目中,因为 profile.User.Identity.IsAuthenticated 它返回 false。

这是我如何调用登录查询和另一个查询以带来一些信息。当我使用网络浏览器连接时,它们都可以工作。问题在于身份。

我的项目

//LOGIN USING WEBSERVICE
    [HttpPost]
    public IActionResult Login(LoginViewModel _login)
    {

        using (var client = new WebClient())
        {
            client.Headers.Add("Content-Type:application/json"); //Content-Type  
            client.Headers.Add("Accept:application/json");
            string result = 
 client.DownloadString("http://localhost/Services/BlueLifeDataService.svc/Login?login='" + 
 _login.db + "\\" + _login.Username + "'&password='" + _login.Password + "'");
            var _result = JsonConvert.DeserializeObject<dynamic>(result);
            if(_result["d"]["Login"].Value == true)
            {
                Response.Cookies.Append("User", _login.Username);
                return RedirectToAction("Index");
            }
            else
            {
                return View();
            }
        }
    }

    //BRING QUERY 
    public  IActionResult Get()
    
    {
        using (var client = new WebClient())
        {
            client.Headers.Add("Content-Type:application/json"); //Content-Type  
            client.Headers.Add("Accept:application/json");
            string result = 
 client.DownloadString("http://localhost/Services/BlueLifeDataService.svc/Aircraft?");
            var _result = JsonConvert.DeserializeObject<dynamic>(result);

            return View();
          
        }

    }

C# 中的网络服务

 public class BlueLifeDataService : DataService<BlueLifeEntities>
 {
    private CommonProfile profile = new CommonProfile();

    /**
    // To call http://localhost:81/Services/BlueLifeDataService.svc/GetTechLog?id=3810L do 
  this
    [DataContract]
    class TechLogDTO 
    {
        public TechLogDTO() 
        {
        }

        [DataMember]
        public long idTechlog { get; set; }
        [DataMember]
        public string sPilot { get; set; }
        [DataMember]
        public string sRemark { get; set; }
        [DataMember]
        public string sAircraftReg { get; set; }
        [DataMember]
        public string sTLNumber { get; set; }
        [DataMember]
        public EntityCollection<CRS> CRS { get; set; }
        public EntityCollection<Files> Files { get; set; }
        public EntityCollection<FlightsAirframe> FlightsAirframe { get; set; }
    }

    //To call http://localhost:81/Services/BlueLifeDataService.svc/GetTechLog?id=3810L do this
    [WebGet]
    [WebInvoke(UriTemplate = "GetTechLog?id={id}", Method = "GET", ResponseFormat = 
  WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json)]
    public string GetTechLog(long id)
    {
        string json;
        using (MemoryStream ms = new MemoryStream())
        {
            DataContractJsonSerializer ser = new 
  DataContractJsonSerializer(typeof(TechLogDTO));
            TechLog e = this.CurrentDataSource.TechLog.FirstOrDefault(t => t.idTechlog == id);
            ser.WriteObject(ms, new TechLogDTO 
            { 
                idTechlog = e.idTechlog, 
                sAircraftReg = e.sAircraftReg,
                sTLNumber = e.sTLNumber,
                sPilot = e.sPilot,
                sRemark = e.sRemark,
                CRS = e.CRS,
                Files = e.Files,
                FlightsAirframe = e.FlightsAirframe
            });
            json = System.Text.Encoding.UTF8.GetString(ms.GetBuffer(), 0, 
  Convert.ToInt16(ms.Length));
        }

        return json;
    }
    */


   #region Configuration

    // Cette méthode n'est appelée qu'une seule fois pour initialiser les stratégies au niveau 
   des services.
    public static void InitializeService(DataServiceConfiguration config)
    {
        // TODO: définissez des règles pour indiquer les jeux d'entités et opérations de 
   service visibles, pouvant être mis à jour, etc.
        // Exemples :
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;

        config.UseVerboseErrors = 
   bool.Parse(RoleEnvironment.GetConfigurationSettingValue("UseVerbose"));
        config.SetEntitySetPageSize("TechLog", 
   int.Parse(RoleEnvironment.GetConfigurationSettingValue("TechLogEntitiesPerPage")));
    }

    protected override BlueLifeEntities CreateDataSource()
    {
        if (profile.User.Identity.IsAuthenticated)
        {
            string connection =
                DBConnectionString.GetEntityConnectionString(profile.DataBase, 
   "Datasets.BlueLife.BlueLifeModel");

            var context = new BlueLifeEntities(connection)
            {
                CommandTimeout = 
   int.Parse(RoleEnvironment.GetConfigurationSettingValue("SQLCommandTimeout"))
            };

            return context;
        }

        return base.CreateDataSource();
    }

     [WebGet]
    public bool Login(string login, string password)
    {
        if (Membership.ValidateUser(login, password) &&
            ServiceAuthHeaderValidation.HasAccessToApplication(login.Split('\\')[0], 
 "BlueLifeServiceSoapClient"))
        {
            if (!Roles.IsUserInRole(login, "iPhone") & !Roles.IsUserInRole(login, "Client"))
                return false;

            FormsAuthentication.SetAuthCookie(login, false);
            return true;
        }
        else
            return false;
    }


    [WebGet]
    public bool Logout()
    {
        if (!HttpContext.Current.Request.IsAuthenticated)
            return false;

        FormsAuthentication.SignOut();
        return true;
    }

    #endregion

    #region Operations

    [WebGet]
    public void UpdateFollowingNewTechLog(string aircraftRegistration)
    {
        if (!profile.User.Identity.IsAuthenticated)
            throw new ArgumentNullException("You're not authenticated. Please, Log in!");

        var lastTL = (from t in this.CurrentDataSource.TechLog
                      where t.sAircraftReg == aircraftRegistration
                      orderby t.idTechlog descending
                      select t).FirstOrDefault();

        var countersToUpdate = (from c in this.CurrentDataSource.Counter
                                where c.sAircraftReg == aircraftRegistration
                                select c.idCounter).ToList();

        var crewMembersToUpdate = this.CurrentDataSource.FlightCrew.Where(fc => fc.idPilot != 
 null &&
            fc.FlightsAirframe.TechLog.idTechlog == lastTL.idTechlog).OrderByDescending(fc => 
 fc.idFlightCrew)
            .Select(fc => fc.idPilot).Distinct().ToList();

        var plannedDutiesToUpdate = this.CurrentDataSource.CrewDuty.Where(cd => cd.idPilot != 
 null &&
            cd.idTechlog == lastTL.idTechlog).OrderByDescending(cd => cd.idCrewDuty)
            .Select(cd => cd.idPilot).Distinct().ToList();

    #region Interceptor

    [QueryInterceptor("Aircraft")]
    public Expression<Func<Aircraft, bool>> OnQueryAircraft()
    {
        string login = HttpContext.Current.Request.QueryString["login"]; 
        string password = HttpContext.Current.Request.QueryString["password"];
        if(!String.IsNullOrEmpty(login) && !String.IsNullOrEmpty(password))
        {
            bool result = Login(login, password);
            if(result)
            {
                return (Aircraft a) => PersonalFleet.Contains(a.sAircraftReg);
            }
            else
            {
                return (Aircraft a) => false;
            }
        }

      
        // Loged in user in this project + Calling from other project
        if (!profile.User.Identity.IsAuthenticated)
        {
            return (Aircraft a) => false;
        }

        return (Aircraft a) => PersonalFleet.Contains(a.sAircraftReg);
    }

标签: c#asp.netvisual-studioapiweb-services

解决方案


从我在您的项目代码中看到的内容来看,您正在 Get 操作中创建一个新的 WebClient,但是当您调用 Web 服务时,您没有传入您在 Login 操作中收到的 FormsAuthentication cookie - 所以它不能验证该请求。您可能想看看:WebClient access page with credentials


推荐阅读