小编Jam*_*mes的帖子

同一解决方案中的MVC和Web Api项目

我有一个MVC 4项目坐在N层应用程序之上.我现在要求能够以编程方式使用应用程序.我在同一个解决方案中创建了一个新的Web Api项目,它位于MVC项目的旁边,再次位于N层应用程序的顶层.

但是我不清楚这一切是如何工作的,因为MVC层是启动项目:它设置我的DI,自动播放器等,并且是我部署到服务器的项目.

那么这一切应该如何建立呢?我可以设置我的MVC项目来将所有/ api请求路由到新的Web Api项目吗?或者Web Api项目是否需要单独部署?

我不想做任何非传统的事情,所以如果有更常见的方式来设置这个,请指出我正确的方向.

谢谢.

c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

22
推荐指数
2
解决办法
3万
查看次数

在asp.net MVC应用程序的web.config中指定角色

我正在使用表单身份验证创建一个MVC应用程序.我正在对活动目录进行身份验证,因此创建了一个自定义RoleProvider.我的应用程序只关注一小部分角色,到目前为止我一直在web.config的appSettings部分中定义:

<appSettings>
  <add key="DirectorRole" value="Domain\Directors" />
  <add key="ManagementRole" value="Domain\Managers" />
  ...
</appSettings>
Run Code Online (Sandbox Code Playgroud)

但是我遇到了这种方法的几个问题:

  1. 我无法在我的控制器数据注释中引用这些设置:[Authorize(Roles = ConfigurationManager.AppSettings["DirectorRole"])]因为它不会编译所以我必须再次指定组的名称:[Authorize(Roles = "Domain\\Directors")].
  2. 在我的web.config中,我想为我的角色提供程序指定groupsToUse,并且只引用一个预先存在的列表,而不是维护同一组角色的两个单独列表.

似乎必须有一个更好/可重用的方法来定义web.config中的角色,有人能指出我正确的方向吗?

asp.net-mvc web-config roleprovider asp.net-mvc-3

19
推荐指数
1
解决办法
2万
查看次数

属性中的依赖注入

我试图将依赖注入到自定义中AuthorizeAttribute,如下所示:

public class UserCanAccessArea : AuthorizeAttribute
{
    readonly IPermissionService permissionService;

    public UserCanAccessArea() :
        this(DependencyResolver.Current.GetService<IPermissionService>()) { }

    public UserCanAccessArea(IPermissionService permissionService)
    {
        this.permissionService = permissionService;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        string AreaID =
            httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;

        bool isAuthorized = false;

        if (base.AuthorizeCore(httpContext))
            isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);

        return isAuthorized;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎是作为一个单身人士解决,这意味着我得到了我以前的问题中描述的问题

我想要做的是使用属性注入但由于我的属性本身没有被Unity解决,我无法找到一种方法来配置容器来拦截和解析属性.我尝试过以下方法:

public class UserCanAccessArea : AuthorizeAttribute
{
    public IPermissionService permissionService { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        string AreaID =
            httpContext.Request.RequestContext.RouteData.Values["AreaID"] …
Run Code Online (Sandbox Code Playgroud)

c# authentication asp.net-mvc dependency-injection unity-container

19
推荐指数
2
解决办法
2万
查看次数

服务层验证

我正在尝试在我的应用程序中实现验证策略.我有一个MVC层,服务层,存储库和域POCO.现在在MVC层,我在我的viewmodels上使用数据注释来验证用户输入,允许我给用户快速反馈.在控制器中,我在使用automapper设置域对象之前调用ModelState.IsValid来检查输入.

这就是我的麻烦所在.我将我的域对象传递给需要根据我的业务规则验证它的服务,但是如何将验证错误传递回控制器?我找到的示例执行以下操作之一:

  • 在Service层中抛出异常并捕获Contoller.但这似乎是错误的,例外情况肯定是例外,我们应该返回一些有意义的东西.
  • 使用ModelStateWrapper并将ModelStateDictionary注入Service.但是这种方法最终会展现成循环依赖(控制器依赖于服务,服务依赖于控制器),这似乎是一个糟糕的代码味道.
  • 将验证方法添加到POCO.问题在于业务规则可能依赖于其他POCO对象,所以这肯定应该在可以访问所需表和对象的服务中完成.

我缺少一种更简单的方法吗?我已经看到很多关于此的问题,但除了上面提到的那些之外没有具体的解决方案.我认为服务中进行验证的任何方法都可以传回一些我可以在控制器中使用的键/值对象,但我不确定此策略是否会在以后出现问题.

validation asp.net-mvc asp.net-mvc-3

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

HttpClient和Windows Auth:将用户消费者登录到服务

我正在努力理解并设置一个服务和消费者,服务将在用户登录消费者时运行.

我的消费者是一个MVC应用程序.我的服务是一个Web Api应用程序.两者都在同一域内的不同服务器上运行.两者都设置为使用Windows身份验证.

我的消费者代码是:

private T GenericGet<T>(string p)
    {
        T result = default(T);

        HttpClientHandler handler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true };
        using (HttpClient client = new HttpClient(handler))
        {
            client.BaseAddress = new Uri(serviceEndPoint);

            HttpResponseMessage response = client.GetAsync(p).Result;
            if (response.IsSuccessStatusCode)
                result = response.Content.ReadAsAsync<T>().Result;
        }

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

在我的服务中,我打电话User.Identity.Name来获取来电显示,但这总是作为消费者应用程序池ID返回,而不是登录用户.消费者应用程序池作为网络服务运行,服务器本身受信任以进行委派.那么如何获取登录用户?服务代码:

    // GET: /Modules/5/Permissions/
    [Authorize]
    public ModulePermissionsDTO Get(int ModuleID)
    {
        Module module= moduleRepository.Find(ModuleID);
        if (module== null)
            throw new HttpResponseException(HttpStatusCode.NotFound);

        // This just shows as the App Pool the …
Run Code Online (Sandbox Code Playgroud)

c# authentication asp.net-mvc web-services asp.net-web-api

14
推荐指数
1
解决办法
2万
查看次数

获取Web层之外的当前Principal

我有以下ntier应用程序:MVC>服务>存储库>域.我正在使用Forms身份验证.在我的MVC层之外使用Thread.CurrentPrincipal来获取我的应用程序的当前登录用户或者我应该使用HttpContext.Current.User是否安全?

我问的原因是Thread.CurrentPrincipal似乎存在一些问题,但是我谨慎地在我的MVC层之外添加对System.Web的引用,以防我将来需要提供非web字体结尾.

更新

我一直在关注到目前为止收到的建议,将用户名传递给服务,作为被调用方法的参数的一部分,这导致了我原始问题的改进.我需要能够检查用户是否在我的许多Service和Domain方法中担任特定角色.似乎有几个解决方案,只是想知道哪个是最好的方法:

  1. 将整个HttpContext.Current.User作为参数传递,而不仅仅是用户名.
  2. 在我的Web层之外调用Thread.CurrentPrincipal并使用它.但是我如何确保它等于HttpContext.Current.User?
  3. 坚持传递目前为止建议的用户名,然后使用Roles.IsUserInRole.这种方法的问题是它需要引用System.Web,我觉得在我的MVC层之外是不正确的.

你怎么建议我继续?

authentication asp.net-mvc forms-authentication iprincipal asp.net-mvc-3

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

向POCO类添加方法

我有以下设置:MVC>服务>存储库.现在我想让用户能够为文档添加注释.只有与文档关联的用户(作为所有者或审阅者)才能添加Notes,因此在我的NoteService中,我执行以下操作以确保用户对所选文档具有权限:

public Note GetNewNote(int documentID)
    {
        if (!userHasAccess(Thread.CurrentPrincipal.Identity.Name))
            throw new BusinessLogicException();

        // Other stuff here...
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,我应该在哪里定义userHasAccess方法?在NoteService中没有任何意义,因为它正在检查Document.我可以在DocumentService中定义它,但是然后NoteService将需要访问它,这似乎引入了更多的耦合.

对我来说,在Document POCO本身上定义它然后调用document.userHasAccess(...)更有意义.这是一个好的做法还是域名POCO应限于简单的属性?我担心这确实是验证的一部分,通过将方法放在POCO中,我将分离Service和POCO之间的验证.

我要确保的是我的应用程序易于维护和测试.关于如何解决这个问题的任何建议都将非常感谢!

validation asp.net-mvc poco asp.net-mvc-3

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

POCO实体上的私有构造函数可防止延迟加载

我有一个POCO实体,我在其上定义了一个自定义构造函数.我还实现了默认构造函数,以便当我从数据库请求副本时,Entity Framework可以成功地保存对象.

这似乎工作得很好但是当我将默认构造函数设置为private(强制我的代码使用自定义版本)并从数据库请求实体时,我似乎无法浏览相关实体,因为它们都是空值.

这似乎是一个懒惰的加载问题所以我可以更改我的存储库以急切加载我需要的相关对象,但我想知道是否有更好的方法从客户端代码隐藏默认构造函数,同时允许实体框架延迟加载?

entity-framework poco

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

用于数据库配置的 OnModelCreating 与 DataAnnotations

我有一个 ntier 解决方案,其中有一个用于我的 POCO 类的域项目。我想生成一些表字段限制为特定长度的数据库。现在我看到有两种方法可以做到这一点,要么在 POCO 类本身中使用数据注释,要么在我的 DbContext 中使用 OnModelCreating 方法,但哪一种是最好的方法?

我对 OnModelCreating 方法的担忧是,这是特定于实体框架的。如果我切换到另一个 ORM,数据库配置就会丢失,除非我重新实现它。

使用注释方法,我最终会弄乱我的模型,并担心它们会丢失“POCO”标签。我也不确定其他 ORM 是否会尊重这些注释。另一方面,有关数据库应该是什么样子的所有信息都与模型相关联,因此易于维护。

有什么想法可以指引我正确的方向吗?

asp.net-mvc entity-framework poco

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

使用派生类参数覆盖抽象方法

我有以下几点:

public abstract class Person
{
    public DateTime CreatedAt { get; set; }
    
    public abstract bool IsMatch(Person person);
}

public class Employee : Person
{
    public int Id { get; set; }
    public string Role { get; set; }

    public override bool IsMatch(Employee person)
    {
        return Id == person.Id;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢我对 IsMatch 方法的覆盖。

  1. 为什么是这样?Empolyee 是一个人,所以为什么要抱怨?
  2. 解决这个问题的最佳方法是什么?我需要在 IsMatch 覆盖中强制转换为 Employee 吗?

谢谢。

.net c#

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