我正在尝试在MVC控制器和Web Api控制器之间使用相同的身份验证.Web api位于/ Controllers/API /文件夹中的同一项目中.
我似乎无法弄清楚如何使用OWIN进行身份验证,当我通过MVC登录并创建声明和cookie时,如下例所示.
var identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name,"Admin"),
new Claim(ClaimTypes.Role,"Administrator")
, "ApplicationCookie");
var ctx = Request.GetOwinContext();
var authManager = ctx.Authentication;
authManager.SignIn(identity);
return RedirectToAction("Index", "Home", null);
}
Run Code Online (Sandbox Code Playgroud)
在MVC控制器中一切正常,但我不能在我的Web API控制器上使用[Authorize(Roles ="Administrator")属性并使其正常工作.它始终让我通过.
谢谢
编辑:只有我能够解决这个问题的方法是使用静态类和属性存储IPrincipal,然后在覆盖授权属性时,查找该属性并检查角色是否存在.我不确定这是不是一个好主意?
我正在尝试查询数据库集,但是当我得到结果时,我似乎无法访问数据.这是我试过的代码.
查询#1:
public List<CustomerMain> testing()
{
var context = new CustomerEntities();
var query = context.CustomerMains
.Where(p=> p.FirstName == "Thor")
.Select(p => new CustomerMain {FirstName=p.FirstName,LastName =p.LastName}).ToList();
return query;
}
Run Code Online (Sandbox Code Playgroud)
查询#2:
public IQueryable<CustomerMain> testing()
{
var context = new CustomerEntities();
var query = context.CustomerMains
.Where(p=> p.FirstName == "Thor")
.Select(p => new CustomerMain {FirstName=p.FirstName,LastName =p.LastName});
return query;
}
Run Code Online (Sandbox Code Playgroud)
CustomerMain
是我的DbSet
,如果我运行其中任何一个并将方法分配给var变量,它就没有选择从变量中获取FirstName
或LastName
从变量中获取.如果我将它转换为a CustomerMain
,我发现我可以这样做,但是返回查询不应该CustomerMain
已经在一个类型中吗?
我知道如何使用任务等来让它在没有异步/等待的情况下工作,但所有的例子和视频我已经注意到我仍然无法理解它.有些人通过在按钮单击中创建任务然后等待该任务来完成它吗?
至今:
private async void button1_Click(object sender, EventArgs e) {
var vari = await GetId();
comboBox1.Items.Add(vari);
}
private Task<string> GetId() {
return Task.Run(() => {
return getstring();
});
}
public string getstring() {
Thread.Sleep(5000);//simulate long task
string d = "Example";
return d;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的方式,这是正确的做法吗?有没有办法可以消除GetId()
方法中另一个任务的运行,并在那里返回一个字符串?