小编Kry*_*ard的帖子

在MVC和Web Api中进行Owin认证

我正在尝试在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,然后在覆盖授权属性时,查找该属性并检查角色是否存在.我不确定这是不是一个好主意?

c# asp.net-web-api owin

3
推荐指数
1
解决办法
5894
查看次数

使用实体框架获得结果

我正在尝试查询数据库集,但是当我得到结果时,我似乎无法访问数据.这是我试过的代码.

查询#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变量,它就没有选择从变量中获取FirstNameLastName从变量中获取.如果我将它转换为a CustomerMain,我发现我可以这样做,但是返回查询不应该CustomerMain已经在一个类型中吗?

c# entity-framework

1
推荐指数
1
解决办法
42
查看次数

了解异步/等待

我知道如何使用任务等来让它在没有异步/等待的情况下工作,但所有的例子和视频我已经注意到我仍然无法理解它.有些人通过在按钮单击中创建任务然后等待该任务来完成它吗?

至今:

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()方法中另一个任务的运行,并在那里返回一个字符串?

c#

1
推荐指数
1
解决办法
107
查看次数

标签 统计

c# ×3

asp.net-web-api ×1

entity-framework ×1

owin ×1