使用ASP.NET MVC站点和ServiceStack API进行身份验证

时间:2014-11-19 00:31:21

标签: asp.net-mvc servicestack

我正在使用ASP.NET MVC和使用ServiceStack的API开发一个网站。

我想很快添加身份验证。该网站将至少有两种类型的用户和服务提供商'和服务消费者'虽然用户可以有多个角色。

我愿意使用新的MVC身份,但我希望我使用的任何东西都可以很好地用于servicestack API和MVC'页面'不一定使用API​​但应根据登录显示不同的内容。我不想要求 javascript进行登录/注销。

我希望解决方案使用令牌,因为我没有在其他任何地方使用会话状态,但我对其他选项持开放态度,只要他们可以在云提供商上水平扩展(用户下一个请求可能会转到不同的后台实例 - 端)。

任何人都有理想解决方案的例子吗?

(N.B:我对外部托管服务不感兴趣)。

2 个答案:

答案 0 :(得分:2)

ServiceStack的身份验证也可以由外部ASP.NET Web框架使用,ServiceStack and MVC Integration docs显示了如何accept Login credentials from a MVC Controller and register them with ServiceStack

public ActionResult Login(string userName, string password, string redirect=null)
{
    if (ModelState.IsValid)
    {
        try
        {
            using (var authService = ResolveService<AuthenticateService>())
            {
                var response = authService.Authenticate(new Authenticate {
                    provider = CredentialsAuthProvider.Name,
                    UserName = userName,
                    Password = password,
                    RememberMe = true,
                });

                // add ASP.NET auth cookie
                FormsAuthentication.SetAuthCookie(userName, true);

                return Redirect(string.IsNullOrEmpty(redirect) ? "/" : redirect);
            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError(string.Empty, ex.Message);
        }
    }

    return View("Index", GetViewModel());
}

http://mvc.servicestack.net现场演示展示了使用标准MVC HTML表格调用此控制器的示例。

然后,您的MVC控制器可以继承ServiceStackController以访问Authenticated Users Session和不同的ServiceStack提供程序,以下是与会话和身份验证相关的API:

public class ServiceStackController : Controller
{
    //...
    ISession SessionBag { get; set; }
    bool IsAuthenticated { get; set; }
    IAuthSession GetSession(bool reload = true);
    TUserSession SessionAs<TUserSession>();
    void ClearSession();
}

启用OAuth提供程序

如果您需要,还可以enable ServiceStack's different OAuth providers,可以选择直接回拨到ServiceStack服务或

答案 1 :(得分:1)

除了mythz回答之外,我还需要知道用户是否在视图中进行了身份验证,并且正常的Request.IsAuthenticated在您执行上述操作时不起作用。所以我创建了一个CustomWebViewPage(要使用它,你必须在View文件夹的Web.config中更改 * pageBaseType =“Your.NameSpace.CustomWebViewPage”)。

public abstract class CustomWebViewPage : WebViewPage
{
    private IServiceStackProvider _serviceStackProvider;
    public virtual IServiceStackProvider ServiceStackProvider
    {
        get
        {
            return _serviceStackProvider ?? (_serviceStackProvider =
                new ServiceStackProvider(new AspNetRequest(base.Context, GetType().Name)));
        }
    }

    public virtual bool IsAuthenticated
    {
        get { return ServiceStackProvider.IsAuthenticated; }
    }
}

public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
    //EXACTLY the same as above method...
相关问题