c# - 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);
}
解决方案
从我在您的项目代码中看到的内容来看,您正在 Get 操作中创建一个新的 WebClient,但是当您调用 Web 服务时,您没有传入您在 Login 操作中收到的 FormsAuthentication cookie - 所以它不能验证该请求。您可能想看看:WebClient access page with credentials
推荐阅读
- c# - 如何通过 HTTP 触发器将数据加载/保存到 CosmosDB?
- angular - 为特定应用程序或库创建块时,webpack 如何了解工作区中的项目特定依赖关系
- database - NoSQL 数据库中的 JSON 差异版本控制
- powershell - 方法调用失败,因为 [System.String] 不包含名为“SelectNodes”的方法
- python - 使用烧瓶一次提交写入三个数据库
- php - 使用加载数据本地 infile 加载不完整的 csv 数据
- vba - VBA,使用标题名称将值从一张表复制到另一张表
- go - 所有测试的 Golang 全局设置(在相同和其他子模块中)。
- sql-server - SISS - 检查 Null DerivedColumn
- sql - 使用嵌套的 IFNULL 沿互斥路径检查表?